文章目录
引入继承概念
什么是继承
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
为什么要有继承
当我们描述多个类的时候,这些类可能会具有相同的属性和行为,不如我们统计一个公司100个职员的姓名年龄,工作类型,工资情况,奖金情况,职位升降。会发现这些数据有些是100个各不相同(姓名年龄),还有些会分成十几种情况(工作类型、奖金、工资),职位升降则只有两种形式(升和降),那当我们统计这些员工之间具有相同性质的数据时如果和姓名年龄一样逐一描述会使过程十分繁琐,这是我们就需要将这些相同的数据抽取成一个类,在逐一录入姓名年龄时只需要继承这些类就可以大大减少程序的工作量。
继承的格式
通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名 {}
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
进一步了解继承
继承的优势与劣势
优势
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
案例演示
- 需求:
学生类和老师类。
定义两个功能(吃饭,睡觉)
使用继承前
使用继承后
- 我们会发现,虽然我们依次定义了学生类和老师类,但是姓名、年龄和性别,以及吃饭睡觉都是学生和老师共有的属性和行为,这就导致了两个类中的成员变量和成员方法一模一样,这时我们可以将学生和老师共有的属性和行为定义成一个父类,并将学生和老师这两个子类继承父类的属性,这样,我们唯一需要录入的就是不相同的姓名、年龄和性别。
劣势
- 类的耦合性增强了。
当我们使用使用继承减少了开发步骤的同时,类之间的耦合性也提高了,如果我们类中出现了需要修改的地方,那么连带的其他和此类有继承关系的类也同样需要修改。 - 耦合:类与类的关系
内聚:就是自己完成某件事情的能力 - 我们开发过程中追求的原则是:
高内聚,低耦合。
不要刻意的继承!
Java中类的继承特点
- Java只支持单继承,不支持多继承。
- Java支持多层继承
继承的注意事项
- 继承的注意事项
- 子类只能继承父类所有非私有的成员(成员方法和成员变量)
- 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
- 不要为了部分功能而去继承
- 什么时候使用继承
继承其实体现的是一种关系:“is a” .
采用假设法。
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
继承中成员变量的关系
- 子类中的成员变量和父类中的成员变量名称不一样,不会影响调用
- 子类中的成员变量和父类中的成员变量名称一样,在子类中访问一个变量的查找顺序(“就近原则”)
- 在子类的方法的局部范围找,有就使用
- 在子类的成员范围找,有就使用
- 在父类的成员范围找,有就使用
- 如果还找不到,就报错
继承的关键字
this和super的区别和应用
通过问题引出super
若子类中的成员和父类中的成员名称一样,则会导致无法访问父类中成员(就近原则)
那么这是我们通过super来访问父类中的成员。
this和super的区别
- this:代表的是本类对象的引用
- super:代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员)
this和super的使用
- 调用成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量 - 调用构造方法
this(…) 调用本类的构造方法
super(…) 调用父类的构造方法 - 调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法
方法重写
什么是方法重写
子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。
使用关键字@Override
来实现方法重写
方法重写的应用
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
这样,即沿袭了父类的功能,又定义了子类特有的内容。
示例:定义一个手机类。
通过研究,我发明了一个新手机,这个手机的作用是不仅可以打电话还可以视频聊天,不仅可以发短信还可以发彩信
方法重写注意事项
- 父类中私有方法不能被重写,因为父类私有方法子类根本就无法继承。
- 子类重写父类方法时,访问权限不能更低。最好一致。
- 父类静态方法,子类也必须通过静态方法进行重写。
final关键字
什么是final
final关键字是最终的意思,可以修饰类,变量,成员方法。
为什么会有final
由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
final修饰特点
- 修饰类: 被修饰类不能被继承
- 修饰方法: 被修饰的方法不能被重写
- 修饰变量: 被修饰的变量变为常量
final关键字修饰局部变量
- 基本类型:其值不能被改变
- 引用类型:其地址值不能被改变