继承的注意事项:
虽然子类中构造方法默认有一个super()
初始化的时候,不是按照那个顺序进行的。
而是按照分层初始化进行的。super仅仅表示要先初始化分类数据,在初始化子类数据。
继承中成员方法的关系:
A:子类和父类中方法声明不一样 -- 正常
B:子类和父类中方法声明一样
查找顺序:子类->父类->如果还找不到就报错
方法重写:子类中出现和父类中方法声明一模一样的方法。(方法覆盖,方法复写)
应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类的方法。这样即沿袭了父类的功能,又定义了子类特有的内容。
注意事项:
A:父类中私有方法不能被重写
父类私有方法子类根本就无法继承
B:子类重写父类方法时,访问权限不能更低
C:父类静态方法,子类也必须通过静态方法进行重写(本质不算重写,只是现象如此)
子类重写父类方法时,最好声明一模一样
---------------以上为昨天补齐的部分----------------------------------------
由于继承中存在一个现象方法重写(override),父类的功能会被子类覆盖掉,为了避免这种情况,java提供了一个关键字:final
1、final:最终的意思,常见的是它可以修饰类,方法,变量。
特点:
final可以修饰类,该类不能被继承
final可以修饰方法,该方法不能被重写(override)
final可以修饰变量,该变量不能被重新复制。因为这个变量其实是常量。
{
常量:
A:字面值常量
"hello",10,true
B:自定义常量
final int x = 10;
}
{
面试题:final修饰成员变量
可以修饰成员变量
基本类型:基本类型的值不能变;
引用类型:地址值不能变,但对象的堆内存的值是可以改变的。(既是内容可以变)
修饰变量的初始化时机
A:被final修饰的变量只能被赋值一次。
B:在构造方法完毕前(非静态常量)。
}
2、多态
同一个对象(事物),在不同时刻表现出来的不同状态。
多态的前提:
A:要有继承关系
B:要有方法重写
C:要有父类引用指向子类对象
父 father = new 子();
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边
B:构造方法
同以前的,先父再子
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
(静态和类相关,算不上重写,所以,访问还是左边的)
由于成员方法存在方法重写,所以它运行看右边。
多态的好处:
A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)
多态的弊端:
不能使用子类的特有功能。
使用子类的特有功能:
A:创建子类对象,调用子类的方法。(可以,但是很多时候不合理,而且太占内存)
B:把父类的引用强制转化为子类的引用(向下转型)
{
对象间的转型问题:
向上转型:
Fu f = new Zi();
向下转型:
zi z = new (Zi)f;//要求该f必须是能够转换为Zi的。
}