java 子类重写父类的方法应注意的问题
来源:互联网 发布:dota2新英雄语音知乎 编辑:程序博客网 时间:2024/06/06 02:44
java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求!
A、重写规则之一:
重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
B、重写规则之二:
参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
C、重写规则之三:
返回类型必须与被重写方法的返回类型相同。
父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
D、重写规则之四:
重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
这个例子中,父类抛出了检查异常Exception,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了更有限的异常,这是可以的。如果反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。
E、重写规则之五:
不能重写被标识为final的方法。
F、重写规则之六:
如果一个方法不能被继承,则不能重写它。
比较典型的就是父类的private方法。下例会产生一个有趣的现象。
这段代码是能通过编译的。表面上看来违反了第六条规则,但实际上那是一点巧合。Animal类的eat()方法不能被继承,因此Horse类中的 eat()方法是一个全新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。
main()方法如果是这样:
Animal h = new Horse();
//Horse h = new Horse();
h.eat();
编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法!
A、重写规则之一:
重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
B、重写规则之二:
参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
C、重写规则之三:
返回类型必须与被重写方法的返回类型相同。
父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
D、重写规则之四:
重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
- import java.io.*;
- public class Test {
- public static void main (String[] args) {
- Animal h = new Horse();
- try {
- h.eat();
- }
- catch (Exception e) {
- }
- }
- }
- class Animal {
- public void eat() throws Exception{
- System.out.println ("Animal is eating.");
- throw new Exception();
- }
- }
- class Horse extends Animal{
- public void eat() throws IOException{
- System.out.println ("Horse is eating.");
- throw new IOException();
- }
- }
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。
E、重写规则之五:
不能重写被标识为final的方法。
F、重写规则之六:
如果一个方法不能被继承,则不能重写它。
比较典型的就是父类的private方法。下例会产生一个有趣的现象。
- public class Test {
- public static void main (String[] args) {
- //Animal h = new Horse();
- Horse h = new Horse();
- h.eat();
- }
- }
- class Animal {
- private void eat(){
- System.out.println ("Animal is eating.");
- }
- }
- class Horse extends Animal{
- public void eat(){
- System.out.println ("Horse is eating.");
- }
- }
main()方法如果是这样:
Animal h = new Horse();
//Horse h = new Horse();
h.eat();
编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法!
0 0
- 子类重写父类的方法应注意的问题
- 子类重写父类的方法应注意的问题
- 子类重写父类的方法应注意的问题
- java 子类重写父类的方法应注意的问题
- java 子类重写父类的方法应注意的问题
- java 子类重写父类的方法应注意的问题
- Java中子类重写父类中的方法应注意的问题
- java中子类重写父类方法要注意的问题
- java中子类重写父类方法要注意的问题
- java中子类重写父类方法要注意的问题
- java 子类重写父类的方法
- java 子类重写父类的方法
- java 子类重写父类的方法
- Java 子类未重写的方法调用父类还是子类的问题
- Java重写equals时应注意的问题汇总
- java方法重写的时候,一个调用父类还是子类方法的问题
- 重写BaseAdapter时应注意的问题
- mybatis 重写时应注意的问题
- 慕课玩儿转swift笔记02-字符串
- 生成5位序列号
- HDU1276士兵队列
- Android--文件监控FileObserver
- 用指针正确的操纵动态数组与正确用delete释放内存的方法
- java 子类重写父类的方法应注意的问题
- poj 1324 Holedox Moving(bfs+状态压缩)
- 黑马程序员------异常小结
- 费用流 csu1506 Double Shortest Paths
- pat(A) 2-06. 数列求和(模拟摆竖式相加)
- NYOJ 2 括号配对问题 (栈 stack)
- 黑马程序员------Foundatin之求单个文件的代码行数
- 文章标题
- Choose the best route