Java review part 3: object-oriented Inheritance

2020/10/12

Java 基础知识第三部分。

面向对象特征 - 继承性

继承是多态的前提。

继承解决的主要问题:共性抽取

继承关系当中的特点:

  1. 子类可以拥有父类的“内容”
  2. 子类还可以拥有自己专有的内容

在父子类的继承关系当中,如果成员变量重名,则创建子类时,访问有两种方式:

  1. 直接通过子类对象访问成员变量 : 等号左边是谁,就优先用谁,没有则向上找。
  2. 间接通过成员方法访问成员变量:该方法属于谁,就优先用谁,没有则向上找。

区分三种变量

  1. 局部变量:直接写局部变量名

  2. 本类的成员变量:this.成员变量名

  3. 父类成员变量:super.成员变量名

继承中成员方法访问规则 :

在父子类的继承关系中欧给你,创建子类对象,访问成员方法规则是

创建的对象是谁,就优先用谁,如果没有则向上找。、

注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,不会向下找子类。

继承中方法的重写(override)/覆盖 :

继承关系中,方法的名称一样,参数列表也一样。

方法覆盖重写特点 :创建的是子类对象,则优先用子类方法

注意事项:

  1. 必须保证父子类之间方法的名称相同,参数列表也相同。

    @override :写在方法前面,用来检测是不是有效的正确覆盖重写。

    写上保证更加的安全。可以不写。

  2. 子类方法的返回值必须小于等于父类方法的返回值范围。

  3. 子类方法权限必须大于等于父类方法权限修饰符

    public > protected > (default) > private

    注:(default)不是关键字default, 而是什么都不写,留空。

设计原则:对于已经投入使用的类,尽量不要修改。推荐定义一个新的类,来重复利用其中共性内容,并且添加改动新内容。

继承中构造方法访问特点

  1. 子类构造方法中有一个默认隐含的"super()“调用,所以一定是先调用的父类构造,后执行的子类构造。

  2. 子类构造可以通过super关键字来调用父类重载构造

  3. super的父类构造调用,必须是子类构造方法的第一个语句。不能子类构造调用多次super构造。

super关键字的用法 - 3种

  1. 在子类的成员方法中,访问父类成员变量
  2. 在子类成员方法中,访问父类成员方法。
  3. 在子类构造方法中,访问父类构造方法。

this关键字的用法

  1. 在本类成员方法中,访问本类成员变量

  2. 在本类成员方法中,访问本类的另一个成员方法

  3. 在本类构造方法中,访问本类另一个构造方法。

    在第三种构造中注意:this(…)调用也必须是构造方法的第一个语句。唯一一个。

    super和this两种构造调用,不能同时使用,只能使用一个。

this和super内存图解

java继承的3个特点

  1. java语言是单继承的。一个类的直接父亲只能有唯一一个。
  2. java语言可以多级继承。父亲有父亲。
  3. 一个子类的直接父类唯一,但是一个父类可以有很多子类。

抽象

抽象方法定义与抽象类定义

抽象类和抽象方法的使用:

  1. 不能直接创建new抽象类对象
  2. 必须用一个子类来继承抽象父类。
  3. 子类必须覆盖重写抽象父类当中所有的抽象方法。 覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上大括号和方法体。
  4. 创建子类对象进行使用。

接口

接口定义基本格式:

public interface 接口名称 {
    // 接口内容
}

接口的抽象方法定义:

接口使用步骤:

  1. 接口不能直接使用,必须有一个“实现类”来实现该接口。
    public class 实现类名称 implements 接口名称 {
        // ...
    }
    
  2. 接口的实现类必须覆盖重写接口中的所有抽象方法。 覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上大括号和方法体。
  3. 创建实现类的对象,使用。

接口的静态方法定义:

接口静态方法使用 :

  1. 不能通过接口实现类的对象来调用接口当中的静态方法
  2. 用法 : 通过接口名称调用静态方法
  3. 格式:接口名称.静态方法名(参数)

接口的私有方法定义:

接口常量定义和使用

一旦使用final关键字,说明不可改变。

注意

  1. 接口中的常量,可以省略public static final,但是不写也照样是这样。
  2. 接口中的常量,必须进行赋值。
  3. 接口中常量的名称,完全使用大写字母,用下划线进行分隔。(推荐命名规则)

使用接口时注意:

  1. 接口不能有静态代码块
  2. 接口不能有构造方法(因为它是不能new的)
  3. 一个类直接父类唯一,但是一个类可以实现多个接口
    public class MyInterfaceImpl implements InterfaceA, InterfaceB {
        // ....
    }
    
  4. 如果实现类所实现的多个接口中,存在重复的抽象方法,只需要覆盖重写一次即可。
  5. 如果实现类没有覆盖重写所有接口中的所有抽象方法,那么实现类必须是抽象类。
  6. 如果实现类实现的多个接口中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
  7. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。

接口之间的多继承

  1. 类与类之间是单继承的。直接父类只有一个
  2. 类与接口之间是多实现的。一个类可以实现多个接口。
  3. 接口与接口直接是多继承的

注意:

  1. 多个父接口中的抽象方法如果重复,没关系
  2. 多个父接口中的默认方法如果重复,子接口必须进行默认方法的覆盖重写。(default不能省去)