Advertisement

【Java基础笔记】第十七章 继承

阅读量:

目录

  • 引言
  • 第十七章 继承机制
    • 17.1 采用继承带来的优势
      • 17.2 继承过程中的变量访问规则
      • 17.3 设计继承的原则与规范
      • 17.4 继承带来的代码特性
      • 17.5 继承后成员变量与方法的访问权限分析
      • 17.6 方法重写的实现与应用
        • 17.6.1 方法重写的实现方式
        • 17.6.2 实现方法重写的适用场景解析
        • 17.6.3 @Override注解在方法重写中的应用指导
        • 17.6.4 方法重写注意事项与最佳实践建议

继承案例1

继承案例1

继承实例1

复制代码
* 17.9 this 和 super 关键字使用总结
* 【继承案例2】this和super的使用

前言

这份教程旨在帮助读者系统掌握Java基础知识点。其他内容:Java基础学习笔记目录 学习用书:《Java核心技术 卷Ⅰ 基础知识(第10版)》及《Java经典编程题解300例》

第十七章 继承

  • 面向对象编程的核心特性包括封装、继承关系以及多态性 *
  • 继承关系是描述两个或多个类别之间遗传联系的方式
  • 当多个类别从一个共同的基础中获得属性和行为时, 它们便能够共享相同的起点
  • 将一组具有相同接口和行为的类别组合在一起形成子类别(派生类别), 而这个专门提供给它们作为基础的就是基底类别(或者超基类)

17.1 使用继承的好处

  • 多个类的相同特征会产生大量代码冗余
多个类的相同特征会产生大量代码冗余
  • 把相同的属性和行为抽离出来,放在父类里,并由子类继承,提高代码复用
提高代码复用

17.2 继承的格式

复制代码
    public class 子类名 extends 父类名 {...}
    
    
      
    
    代码解释

17.3 继承设计规范

各类子类的共同特征(包括共性属性与共性方法)应首先在父类中进行定义,在子类自身中则应单独定义独有的属性与行为。

17.4 继承的特点

  • 子类沿袭其属性和行为而无法继承其父级构造器。

  • 子此类拥有独立的构造程序负责初始化其自身。

  • 该子类别可继承自其上层程序而私有字段与方法则不可直接访问。

  • 而静态成员则可被直接调用,并且它们是共享的。

  • Java采用单一继承机制:程序仅能从一个直接父类型继承

  • Java不允许多个独立的父类型被同一个子类型同时拥有

  • 每个程序都必然属于Object的一个子类型

17.5 继承后:成员变量、成员方法的访问特点

  • 就近原则: 首先,在子类局部范围内查找。
    接着,在子类成员范围内查找。
    最后,在父类成员范围内查找;如果没有找到,则会报错。

  • 在子父类中出现具有相同名称的成员时,默认情况下会优先选择使用子类中的成员。

  • 可借助关键字super明确指示程序访问其父类中的相关成员。

17.6 继承后:方法重写

17.6.1 方法重写

在继承结构中存在一个与父类完全相同的方法声明,在这种情况下子类重写了该方法。

17.6.2 方法重写的应用场景

当子类有需求时(或:如果发现父类提供的功能无法完全满足其需求),则可以选择重构或修改父类的方法以适应新的需求

17.6.3 @Override重写注释

  • @Override用于将重写了的方法置于其所在类中,并判断是否正确。
  • 添加了该注解之后,在编译过程中若出现错误会显示相应的提示信息。
  • 提醒所有需要继承的类或接口中的方法都应该在其实现类中放置@Override标记以确保代码的安全性。

17.6.4 方法重写的注意事项和要求

  • 在进行方法改写的操作时,请务必确保所选择的新旧方法名称以及形参列表完全一致。
    • 对于私有成员而言,在继承过程中无法对其进行修改。
    • 若子类决定对父类的方法进行改写,则该子类的方法在访问权限上必须不低于其父类,并且需遵循缺省、protected或public三种权限等级中的相应规定。
      因此,在这种情况下建议您避免直接对父类中的静态成员进行修改。

17.7 继承后:子类构造器的特点

  • 所有子类的构造方法在执行时会首先调用其所属对象所属对象所属类别中的无参数构造方法(即parent class's no-arg constructor),随后才会继续执行自身定义的具体操作。
    • 为什么?
      • 当子实例进行初始化操作时可能会需要用到其所属对象(即parent instance)存储的一些属性或数据
      • 如果所属对象还没有完成全部初始化工作(即parent object未完全创建完毕),那么后续的操作可能导致不可预见的问题
      • 必须确保在调用自身定义的构造函数之前(或者同时),其所属对象已经完成了必要的初始化工作
      • 通常情况下,默认情况下所有自定义化的子实例都会有以下特性: 在第一行代码处显式或隐式地包含了一个对上层基线分类别中对应方法的调用(即super());即使未显式写出超()函数调用也不会影响程序运行

【继承案例1】构造器的使用

复制代码
    public class Animal {
    public Animal() {
        System.out.println("==父类Animal无参构造器执行==");
    }
    
    public Animal(String name) {
        System.out.println("==父类Animal有参构造器执行==");
    }
    }
    
    public class Cat extends Animal {
    public Cat() {
        // super(); 默认存在该语句
        System.out.println("==子类Cat无参构造器执行==");
    }
    
    public Cat(String name) {
        // super(); 默认存在该语句
        System.out.println("==子类Cat有参构造器执行==");
    }
    }
    
    public class Test {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        System.out.println("----------");
        Cat cat2 = new Cat("Kitty");
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释
复制代码
    ==父类Animal无参构造器执行==
    ==子类Cat无参构造器执行==
    ------------------------------
    ==父类Animal无参构造器执行==
    ==子类Cat有参构造器执行==
    
    
      
      
      
      
      
    
    代码解释

17.8 继承后:子类构造器访问父类有参构造器

17.8.1 super调用父类有参构造器的作用

  • 初始化继承父类的数据

17.8.2 父类中没有无参构造器,只有有参构造器

  • 子类中会报错。因为子类默认调用父类无参构造器

17.8.3 如何解决?

  • 子类构造器中可以通过添加 super(…),手动调用父类的有参构造器

17.9 this 和 super 关键字使用总结

  • this: 本类对象的引用
  • super: 父类存储空间的标识
关键字 访问成员变量 访问成员方法 访问构造器
this this.成员变量,访问本类成员变量 this.成员方法(…) ,访问本类成员方法 this(…),访问本类构造器
super super.成员变量,访问父类成员变量 super.成员方法(…),访问父类成员方法 super(…),访问父类构造器
  • this(...) 和 super(...) 使用注意:
  • 子类可以通过 this(...) 调用本类的其他方法或属性(这些方法或属性会在调用时自动触发super()来访问或执行父类的方法或属性),从而最终都会触发父类的方法或属性。
  • 此外,请注意 that these (...) 和 super(...) 只能作为第一个语句使用,在后续代码中可能会导致编译错误。

【继承案例2】this和super的使用

复制代码
    public class Cat extends Animal {
    private String name;
    private int age;
    
    public Cat(String name) {
        // 此时没有super()语句,会使用另一个有参构造器中的super()语句
        this(name, 3); // 作用:当只给cat对象name值时,age默认为3
    }
    
    public Cat(String name, int age) {
        // super(); 默认存在该语句
        this.name = name;
        this.age = age;
    }
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

全部评论 (0)

还没有任何评论哟~