写在开头
Java语言的三大特点之一:继承
是面向对象语言的一大基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
今天我们就来简单说一下这部分内容
继承概念
- 面向对象语言三大特征之一
- 类与类之间,存在一中包含与被包含的关系,抽象理解为父与子的关系,子类可以继承父类的变量和方法
- extends关键字表示这种继承关系
- class A extends B
- 父类也叫超类 基类
- 子类也叫派生类
- 不支持多继承 但是支持多层继承
使用场景
- 动物界里的继承
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
2.细化一点表示
1 | 什么时候使用继承关系比较合适: |
子类:
1 |
|
子类:
1 | // 狗继承了动物,是动物的子类 |
父类:
1 | //动物类 |
实现类:
1 | public class TestAnimal |
继承的优势和弊端
1 | 继承的优势: |
使用继承的注意事项
1 | 1. 父类中的私有成员(成员变量,方法),不能被子类继承到 |
成员变量在继承中的关系
1 | 子类继承父类后,可以无条件的继承父类中的非私有成员 |
子类:
1 | //子类 |
父类:
1 | // 父类 |
super 关键字的使用
this : 本类对象的引用 this的引入: 解决本类中成员变量和局部变量重名问题
super : 表示父类对象的引用
super使用场景:
用于解决子父类中 : 1) 变量重名问题 ; 2)方法重名问题; 3)构造方法
使用方法:
子父类变量重名问题解决:
在子类中使用 super.变量 : 表示调用父类中的成员变量子父类变量重名问题解决:
在子类中使用 super.方法名() : 表示调用父类中的方法子类中调用父类的构造方法:
在子类构造方法中第一行写 super() 或者super(参数列表) 调用父类的指定构造方法
super使用的注意事项: super表示父类对象,为非静态结果,不能在static静态方法中使用
1 | //子类 |
** this 和super在内存中的运行过程
1 | // this和super的使用 |
成员方法在继承中的关系
1 | 子类继承父类后,可以无条件的继承父类中的非私有方法 |
1 | //子类 |
1 | // 父类 |
构造方法在继承中的关系
1 | 1. 构造方法不能继承 |
final修饰词
final : 表示最终的,不可变的
final修饰符
- 修饰类: 使用final修饰的类,不能当父类
- 修饰方法: 使用final修饰的方法,不能被重写
- 修饰变量: 使用final修饰的变量,不能二次赋值
为什么要使用final:
- 有很多类,本身功能已经很健全,不希望子类重写我的任何方法,不要子类,不能被继承使用一切正常
- 很多方法,本身功能很完善,不希望子类重写这个方法,但可以正常使用
- final修饰的变量,通常叫常量(程序执行过程中,值不变,称之为常量)
final修饰的变量,只能手动赋值一次,以后不能修改,修改报错;
final修饰的成员变量,赋值时机,需要在对象创建完成之前完成
赋值方式: 1) 定义就直接赋值(最推荐) 2)构造代码块或者构造方法赋值(不太推荐)
final修饰变量举例:
派 π : 全世界,3.14…..
将π定义成final类型的变量 static final double PI = 3.1415926….; // 静态常量
1 | // final关键字修饰变量,不能被二次赋值 |
1 | //final关键字修饰类不能当父类,案例 |
1 | // 错误的类继承,原因finalDemo1是final修饰的 |
1 | // 父类 |
1 | // final修饰的方法不能被重写 |
总结
- 代码块:
局部代码块:限定变量的生命周期
构造代码块:初始化成员变量,每个构造方法执行之前都会执行一次构造代码块
静态代码块:随着类的加载而执行【常用】 - 继承概述:
extends - 好处:
提高代码的复用性
提高代码可维护性
多态的前提 - 注意事项:
私有的成员不能被继承:不能在子类中直接访问,只能间接访问
构造方法不能被继承,子类中可以通过super关键字调用父类中的构造方法
不要因为部分功能而定义继承关系,子类是父类的一种 - 继承中成员变量的关系:
子父类中出现了同名的变量,根据就近原则,先在子类成员位置寻找,再到父类的成员位置寻找 - this和super
关键字this表示本类当前对象的引用,哪个对象再调用this所在的方法,this就表示哪个对象
关键字super表示本类当前对象父类的的引用,哪个对象在调用super所在的方法,super就表示哪个对象中,父类部分的数据
Super只能访问父类中的成员、this可以访问子类和父类中的所有成员 - 继承中构造方法的关系
子类的构造方法一定要访问父类的构造方法,子类的构造方法在执行之前,一定要先运行父类的构造方法
子类的构造方法第一句,默认是super()
如果手动访问了父类的构造,super()不给默认提供
如果手动访问了子类的其他构造,super()不给默认提供
this语句和super语句都必须在构造方法的第一行
this语句和super语句不能共存 - 方法的重写:
在子父类中,出现了一模一样的方法声明,但是有不一样的方法实现
用@Override注解检查子类方法的重写 - 方法重写的注意事项:
私有方法不能重写
重写的权限不能越来越小 - final关键字
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变成常量,只能赋值一次
晚安
今天就到这里了,明天见,加油!