【JAVA】java⽅法覆写规则
A、重写规则之⼀:
重写⽅法不能⽐被重写⽅法限制有更严格的访问级别。(但是可以更⼴泛,⽐如⽗类⽅法是包访问权限,⼦类的重写⽅法是public访问权限。)
⽐如:Object类有个toString()⽅法,开始重写这个⽅法的,时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的⽅法具有包访问权限,包访问权限⽐public当然要严格了,所以编译器会报错的。
B、重写规则之⼆:
参数列表必须与被重写⽅法的相同。重写有个孪⽣的弟弟叫重载,也就是后⾯要出场的。如果⼦类⽅法的参数与⽗类对应的⽅法不同,那么就是你认错⼈了,那是重载,不是重写。
C、重写规则之三:
返回类型必须与被重写⽅法的返回类型相同。
⽗类⽅法A:void eat(){} ⼦类⽅法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。⽗类⽅法A:int eat(){} ⼦类⽅法B:long eat(){} 返回类型虽然兼容⽗类,但是不同就是不同,所以不是重写。
D、重写规则之四:
重写⽅法不能抛出新的异常或者⽐被重写⽅法声明的检查异常更⼴的检查异常。但是可以抛出更少,更有限或者不抛出异常。
1 import java.io.*;
2
3 public class Test {
4 public static void main (String[] args){
5 Animal h = new Horse();
6 try {
7 h.eat();
8 } catch (Exception e) {
9
10 }
11 }
12 }
13
14 class Animal {
15 public void eat()
16 throws Exception{
17 System.out.println ("Animal is eating.");
18 throw new Exception();
19 }
20 }
21
22 class Horse extends Animal{
23 public void eat()
24
25 throws IOException{
26 System.out.println ("Horse is eating.");
27 throw new IOException();
28 }
29 }
这个例⼦中,⽗类抛出了检查异常Exception,⼦类抛出的IOException是Exception的⼦类,也即是⽐被重写的⽅法抛出了更有限的异常,这是可以的。如果反过来,⽗类抛出IOException,⼦类抛出更为宽泛的Exception,那么不会通过编译的。
注意:这种限制只是针对检查异常,⾄于运⾏时异常RuntimeException及其⼦类不再这个限制之中。
E、重写规则之五:
不能重写被标识为final的⽅法。
F、重写规则之六:
如果⼀个⽅法不能被继承,则不能重写它。⽐较典型的就是⽗类的private⽅法。
下例会产⽣⼀个有趣的现象。
1 public class Test {
2 public static void main (String[] args) {
3 //Animal h = new Horse();
java重写和重载的区别4 Horse h = new Horse();
5 h.eat();
6 }
7 }
8
9 class Animal {
10 private void eat(){
11 System.out.println ("Animal is eating.");
12 }
13 }
14
15 class Horse extends Animal{
16 public void eat(){
17 System.out.println ("Horse is eating.");
18 }
19 }
这段代码是能通过编译的。表⾯上看来违反了第六条规则,但实际上那是⼀点巧合。Animal类的eat()⽅法不能被继承,因此Horse类中的 eat()⽅法是⼀个全新的⽅法,不是重写也不是重载,只是⼀个只属于Horse类的全新的⽅法!这点让很多⼈迷惑了,但是也不是那么难以理解。
main()⽅法如果是这样: Animal h = new Horse(); //Horse h = new Horse(); h.eat(); 编译器会报错,为什么呢?Horse类的eat()⽅法是public的啊!应该可以调⽤啊!
这⾥就牵扯到⼀个向上转型的概念了,当⽗类引⽤了⼦类的⼀个实例时,⼦类复写了⽗类的⽅法会覆
盖⽗类中相同的⽅法,但⼦类中有⽽⽗类中没有的⽅法⽗类就⽆法调⽤。在这个例⼦中,由于Animal中的eat⽅法是private的,所以⼦类中的eat⽅法不算复写了⽗类的eat⽅法,这是⼀个新⽅法,所以调⽤⽗类的eat⽅法时,就⽆法调⽤⼦类的eat⽅法,⽽⽗类的eat⽅法为private,所以发⽣了错误。
请牢记,多态只看⽗类引⽤的⽅法,⽽不看⼦类对象的⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论