继承

 

继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法

父类,也被称为基类、超类。子类,也被称为派生类

继承中子类的特点 1、子类可以有父类的内容 2、子类还可以有自己特有的内容

继承的格式:

 

继承的练习

 

继承的好处和弊端

继承好处 1、提高了代码的复用性,多个类相同的成员可以放到同一个类中 2、提高了代码的维护性,如果方法的代码需要修改,修改一处即可

继承弊端 1、继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时,子类实现也不得不跟着变化,削弱了子类的独立性

什么时候使用继承 1、继承体现的关系:is a 即什么是什么的一种 2、假设法:我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说明他们存在继承关系,这个时候就可以考虑使用继承来体现,否则就不能滥用继承 3、举例:苹果和水果(可以用继承),猫和动物(可以用继承),猫和狗(不能用继承)

 

继承中变量的访问特点

在子类方法中访问一个变量 1、子类局部范围找 2、如果子类局部范围没有找到,就去子类成员范围找 3、如果子类成员范围也找不到,就会去父类(亲父亲,不是祖辈父亲)成员范围找 4、都没有找到就会报错

 

访问特点的练习

 

super关键字

super关键字的用法和this关键字的用法相似 1、this:代表本类对象的引用 2、super:代表父类存储空间的标识(可以理解为父类对象引用)

关键字访问成员变量本类访问构造方法访问成员方法
thisthis.成员变量【本类】this(…)【本类】this.成员方法(…)【本类】
supersuper.成员变量【父类】super(…)【父类】super.成员方法(…)【父类】

 

super关键字的练习

 

继承中构造方法的访问特点

子类中所有的构造方法默认都会访问父类中无参的构造方法

理由: 1、因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化 2、每一个子类构造方法的第一条语句默认都是:super(),而super()又是无参构造方法,所以一定会调用(访问)父类的无参构造方法

每一个子类构造方法的第一条语句默认都是:super()。这个super()调用方法在代码里是不显示的,系统自己额外执行的

如果父类中没有无参构造方法,只有带参构造方法,该怎么办,提供两种解决办法 1、通过使用super关键字做到'显示的调用'父类的带参构造方法 2、在父类中自己提供一个无参构造方法 --> 更推荐这种做法

 

访问特点的练习

 

继承中成员方法的访问特点

通过子类对象访问一个方法 1、子类成员范围找 2、父类成员范围找 3、如果都没有找到就报错(只在子类和子类的亲父类找)

 

访问特点的练习

 

方法重写

方法重写概述 1、子类中出现了和父类中一样的方法声明的现象

方法重写应用 1、当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

@Override 1、是一个注解 2、可以帮助我们检查重写方法的方法声明是否正确

 

方法重写的练习

 

方法重写的注意事项

方法重写注意事项 1、父类的私有方法不能被子类重写 2、子类方法访问权限(访问权限修饰符)不能比父类低,常见的访问修饰符的访问权限大小比较(public>默认>private)

 

方法重写注意事项的练习

 

继承的注意事项

1、java中类只支持单继承,不支持多继承 2、java中类支持多层继承(间接实现多继承)

 

继承注意事项的练习

 


 

【以下是两个综合练习案例】

 


 

老师和学生案例

需求:定义老师类和学生类,然后写代码测试,最后找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试

思路: 1、定义老师类,包括姓名,年龄,教书() 2、定义学生类,包括姓名,年龄,学习() 3、定义测试类,写代码测试

 

实现如下

 

猫和狗案例

需求: 采用继承的思想实现猫和狗的案例,并测试

 

实现如下