方法重载
编译时的多态:
是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态
判定一个方法是否属于重载或重复定义是根据方法的签名来定。
方法签名 = 方法名 + 形参列表
tes(int a ,dobule b);
test(int a ,int b);
方法覆盖/重写
- 运行时多态(子类重写父类方法):
用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态!
运行时多态,也就是动态绑定,是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断并调用相应的属性和方法.
“方法的签名” 与父类一模一样,并且在父子类之间出现方法签名一致, 这个叫重写/覆盖
编译时,
(1) 一旦检查到方法签名一致的。
(2) 子类必须能看见父类的方法:
1、父类的方法不私有,父类方法没有使用了包权限
2、对于父类方法可调用, 认为就是想重写, 条件必须满足重写的规范.
重写的规范
[1] 返回值: 类型相同
重写的权限修饰符
1] 权限修饰符: 子类权限 >= 父类权限
public 》 protected 》 default 》 private
在方法前加上@Override, 编译器会帮你做重写检查
总结
重写方法的规则:
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。