2018-05-01
方法覆盖(重写)
override(覆盖):
覆盖解决的问题:当父类的某一个行为(方法)不符合子类具体的特征时,此时父类需要重新定义父类方法,并重写方法体。
注意:只有方法才有覆盖的概念,字段没有。
方法覆盖的原则:
1、实例方法签名必须相同。(方法签名 = 方法名称 + 方法参数列表)
2、子类方法不能返回比父类方法更大的数据类型,子类方法的返回值类型必须和父类方法的返回值类型相同,或者子类方法的返回值类型是父类方法的返回值类型的子类。
(子类可以返回更具体的数据类型,比如父类返回Object,子类可以返回String)
3、子类方法不能低于父类方法的访问权限
4、子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类 。
5、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。
建议:直接复制父类方法到子类中,再重写其方法体即可。
方法覆盖的判断:在方法前写上@override标签。
若覆盖成功,则编译通过,否则编译失败。
代码举例:
1 //鸟类
2 class Bird
3 {
4 public void fly(){
5 System.out.println("自由飞翔");
6 }
7 }
8 //企鹅
9
10 class Penguin extends Bird
11 {
12 @override
13 public void fly(){
14 System.out.println("折翼天使");
15 }
16 }
17
18
19
20 //方法覆盖
21 class OverrideDemo
22 {
23 public static void main(String[] args)
24 {
25 //创建一个企鹅对象
26 Penguin p = new Penguin();
27 //调用飞翔方法
28 p.fly();
29 }
30 }
输出结果:
参考博客:
http://ihyperwin.iteye.com/blog/1553609
-----------------------------------------------------------------------------------------------------------------------
方法覆盖和方法重载的区别:
override:覆盖(重写)
overload:重载
实际上两者没有任何关系。
方法重载定义:在一个类中定义多个同名的方法,要求方法之间的参数列表不同即可。
方法重载的作用:完成一组任务相似但参数的类型或参数的个数不同的方法。(屏蔽同一功能的方法由于参数不同而造成方法名称不同的差异)
方法重载的调用:Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。
方法重载的判断:两同一不同
两同:同一个类,方法名称相同
一不同:方法的参数列表不一致(参数类型、参数个数、参数顺序)
注意:方法重载和方法返回值类型无关,只是一般要求同一功能的方法返回值类型一致
参数列表和参数名称无关,也就是说方法重载和形参无关
Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。