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


总结:

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


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


目录
相关文章
|
2月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
8天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
16 2
|
29天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
13天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
13天前
|
Java
java继承和多态详解
java继承和多态详解
33 5
|
13天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
18 3
|
1月前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
44 9
Java——类与对象(继承和多态)
|
18天前
|
Java
为什么Java不支持多继承
本文讨论了Java不支持多继承的原因,包括避免菱形继承问题、简化编程语言和防止层次膨胀,同时提供了实现多继承效果的替代方案,如实现多接口、使用组合和继承加接口的方式。
12 0
为什么Java不支持多继承
|
5天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第6天】Java零基础教学篇,手把手实践教学!
12 0
|
1月前
|
Java
Java 的继承
在一个森林中,各种动物共存,如狗和猫。为了管理和组织这些动物,我们采用面向对象的方法设计模型。首先创建 `Animal` 超类,包含 `name` 和 `age` 属性及 `makeSound()` 和 `displayInfo()` 方法。接着,通过继承 `Animal` 创建子类 `Dog` 和 `Cat`,重写 `makeSound()` 方法以发出不同的声音。实例化这些子类并使用它们,展示了继承带来的代码重用、扩展性和多态性等优点。这种方式不仅简化了代码,还体现了现实世界的层次结构。