面向对象三大特性: 封装性(Polymorphism),继承性(Inheritance),多态性(Polymorphism)

继承是多态的前提,没有继承就没有多态!

 

继承

继承主要解决:共性抽取

如图,因为讲师类和助教类都有相同属性(姓名和工号),因此将这两个属性抽取出来放在员工类,让讲师类和助教类继承员工类的属性。这样就不用每个类都定义一遍相同的属性(或方法):

 

Course Note: 继承

 

父类:parent class

子类:subclass

 

 

继承的格式

在上面的关系里,因为子类和父类拥有完全相同的属性,子类可以被看成父类(即讲师就是一个员工)。因此关系为 is-a

 

Course Note: 继承

 

定义一个父类:

Course Note: 继承

 

定义子类

Course Note: 继承

 

在主class中实例化子类,就可以调用子类从父类那继承的方法

Course Note: 继承

方法被运行:

Course Note: 继承

 

 

在继承关系中成员变量(属性)的访问

 

定义一个父类

Course Note: 继承

 

定义一个子类

Course Note: 继承

 

在主类中运行

Course Note: 继承

 

若在继承关系中出现成员变量同名的情况:

 

访问规则:

1.直接访问

即直接通过子类对象访问成员变量。

(等号左边是谁,就优先谁。没有就向上找)

用上面的例子,在父类和子类里分别添加同名的变量:

Course Note: 继承

Course Note: 继承

 

Course Note: 继承

输出

Course Note: 继承

若子类里没有该属性,就向上到其父类里面找

 

2.间接访问

通过成员方法访问成员变量。

在这种情况下,被调用的方法,只会优先访问该方法所在类里的成员变量

Course Note: 继承

若方法所在类没有该方法所需调用的成员变量,就往父类里找

 

父类.子类的成员变量,局部变量三者重名时的访问

 

Course Note: 继承

Course Note: 继承

 

分别用以下方法访问:

(该方法在子类中)

Course Note: 继承

 

 

 

在继承关系中,对于方法的访问

 

与属性一样,子类会继承父类方法。所以子类拥有的方法=子类方法+父类方法

其调用也与属性一样 子类对象. 子类方法

若子类与父类各自拥有的方法重名,优先级和属性一样:创建的对象是谁(即子类对象.方法 这里的子类对象是哪个类),就优先用谁的方法。没有就向上找

即先子类 ,子类没有再找父类。

 

 

在继承关系中,方法的重写override

1.在继承关系中,子类父类各自拥有的方法名称一样,参数列表也一样时

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

此时可以写@override(是一个注解)在方法前,检测是不似乎有效的正确的覆盖重写

3. 子类方法的权限必须大于等于父类方法的权限修饰符(public>protected>(default)>privat)(default)不是关键字 是留空的意思

什么时候需要使用重写:

Course Note: 继承

 

Course Note: 继承

Course Note: 继承Course Note: 继承

主类

Course Note: 继承Course Note: 继承

 

 

在继承关系中,构造方法的访问

1.子类构造方法中默认有一个隐藏的"super()"调用。因此调用子类构造方法的时候会先调用父类构造方法

Course Note: 继承

2.子类构造可以通过super关键字调用父类重载构造 通过super(参数)调用父类的有参构造方法

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

Course Note: 继承也不能同时调用两个

Course Note: 继承

4.子类必须调用父类构造方法,不写则自动添加运行super(),写了则用制定的super调用

 

相关文章: