Java-继承和组合(上)

简介: Java-继承和组合(上)

1. 为什么需要继承



            Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联。例如:动物狗和猫。


cd03e05845ec4fca9b4bf28bc221cf95.png77c43723bb4443aba0d6272f666c28bc.png


对他们进行描述,可有以下代码


public class Dogs {//狗
    String name;
    int age;
    float weight;
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
    public  void sleep(){
        System.out.println(this.name+"正在睡觉");
    }
    public void bark(){
        System.out.println(this.name+"汪汪汪~~~");
    }
}
public class Cats {//猫
    String name;
    int age;
    float weight;
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
    public  void sleep(){
        System.out.println(this.name+"正在睡觉");
    }
    public void mew(){
        System.out.println(this.name+"喵喵喵~~~");
    }
}

a4d33f8cdc5844dc8f7a9d666328ebac.png


对于他们共有的代码块,我们是否能提取这些共性呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。


2 .继承概念



 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。


如上文中的猫和狗我们就可以将他们的共性提取,用继承的思想实现。


image.png


上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。继承最大的作用就是:实现代码复用,还有就是来实现多态。

 

3. 继承语法



            在Java中如果要表示类之间的继承关系,需要借助extends关键字。

修饰符 class 子类 extends 父类{
                //....
        }


  对上述代码使用继承方式。

public class Animals {
    String name;
    int age;
    float weight;
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
    public  void sleep(){
        System.out.println(this.name+"正在睡觉");
    }
}
public class  Dogs extends Animals{
     public  void bark(){
        System.out.println(this.name+"汪汪汪~~~");
    }
}
public class Cats extends Animals{
    public void mew(){
        System.out.println(this.name+"喵喵喵~~~");
    }
}
public class TextJicheng {
    public static void main(String[] args) {
        Dogs dog=new Dogs();
        //Dogs中没有成员变量,继承父类中的
        System.out.println(dog.name);
        System.out.println(dog.age);
        //Dogs中没有eat和sleep函数,继承父类中的
        dog.eat();
        dog.sleep();
        dog.bark();
    }
}

706409f68e8f4f9ebcc34d81a3981156.png

注意:子类会将父类中的成员变量或者成员方法继承到子类中;子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承。


4. 父类成员访问



在继承体系中,子类将父类中的方法和成员变量都继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?


     1.子类中访问父类的成员变量

          (1)子类和父类不存在同名成员变量

public class  Dogs extends Animals{
     public  void bark(){
        System.out.println(this.name+"汪汪汪~~~");
    }
    public void mathod(){
         name="huahua";
         age=5;
         weight=5.2f;
    }
}


(2)子类和父类成员变量同名


public class Cats extends Animals{
    String name;
    String color;
    public void mew(){
        System.out.println(this.name+"喵喵喵~~~");
    }
    public void mathod(){
        name="赛虎";//同名
        age=4;      //父类中有
        color="黑白";//父类中没有
    }
}


在子类方法中或者通过子类对象访问成员时

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。


2. 子类中访问父类的成员方法

            (1)成员方法名不同  


public class  Dogs extends Animals{
     public  void bark(){
        System.out.println(this.name+"汪汪汪~~~");
    }
    public void method(){
         bark();    //访问子类的方法
         eat();     //访问父类的方法
    }
    public static void main(String[] args) {
     Dogs dog=new Dogs();
     dog.method();
    }
}

8269c997eb36427b9266e8bb22f51dd4.png


总结:成员方法不同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错


               (2)成员方法名相同


public class Cats extends Animals{
    String name;
    String color;
    public void mew(){
        System.out.println(this.name+"喵喵喵~~~");
    }
    public void sleep(){
        System.out.println(this.name+"睡醒了");
    }
    public static void main(String[] args) {
        Cats cat=new Cats();
        cat.sleep();
    }
}

dcfb9f66814548f5b5538c41e58590cd.png


总结:

  • 通过子类对象访问父类与子类中不同名方法时优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
  • 通过字类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错


如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?


目录
相关文章
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
14天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
14天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
27 2
|
14天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
14天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
25天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
27 2
|
29天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
20 5
|
29天前
|
Java
java继承和多态详解
java继承和多态详解
38 5
|
29天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
20 3