一、子类与父类方法的关系
1、延续 父类存在子类不存在
2、新增 父类不存在子类存在
3、重写 父类子类都存在
ps:分析方法调用的规则
编译时:从左边的引用类型开始分析,追溯到Object类
运行时:从右边的对象类型开始分析,追溯到Object类.
二、使用程序鉴定重写
1、@Override -->编译期:如果重写失败则编译错误
2、在父类 定义方法 ,调用
如下图:
在main方法中调用test(‘a’)方法。在编译时期test 会根据方法名和参数列表确认调用的print(int)。但是,在运行时期从对象开始分析则会调用pig类的print(int)方法
三、重写的条件(用眼睛来判断重写)
总体:在合理范围内提高子类可见性
存在继承关系+方法签名必须相同+下面3条
1、返回类型 :void和基本类型必须等于void或基本类型。引用类型重写方法的返回值是父类方法返回值的子类或与父类方法返回值类型相同
2、可见性 子类方法的可见性必须大于等于父类。(如:父类方法是default则子类重写的方法只能是default或public)
3、重写方法抛出的异常必须是父类方法抛出异常的子类或与父类方法抛出异常类型相同。
如:
Animal print() throws Exception
Animal print () throws RuntimeException
四、不能被重写的方法
1、私有方法不能被重写,但是加上@Override 才会在编译时期报错
2、静态方法不能被重写,如果子类要写一个与父类静态方法相同签名的方法,则这个方法必须声明为static
3、final 方法 不能重写 ,否则会出现编译错误
五、一个神奇的现象
B b = new B();
D d = new D();
b.show(d)
输出的结果是 A and D
这个实验说明这样一个问题:
在编译的时候,如果this中找不到与实际参数类型相同的方法,会先到父类里面寻找。如果找不到,才考虑使用形参为实际参数父类的方法。