java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求!
A、重写规则之一:
重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
反正子类写public就肯定是没错的
B、重写规则之二:
参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
C、重写规则之三:
返回类型必须与被重写方法的返回类型相同。
父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
D、重写规则之四:
重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
1 import java.io.*; 2 public class Test { 3 public static void main (String[] args) { 4 Animal h = new Horse(); 5 try { 6 h.eat(); 7 } 8 catch (Exception e) { 9 } 10 } 11 } 12 13 class Animal { 14 public void eat() throws Exception{ 15 System.out.println ("Animal is eating."); 16 throw new Exception(); 17 } 18 } 19 20 class Horse extends Animal{ 21 public void eat() throws IOException{ 22 System.out.println ("Horse is eating."); 23 throw new IOException(); 24 } 25 }
这个例子中,父类抛出了检查异常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(); 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 h=new Horse();这个体现了多态,但是h.eat()只会调用子类重写父类的那个方法,而该demo中因为父类的方法是private的,所以子类无法重写这个方法,也就是子类那个eat()是子类自己新创建的方法,跟父类没有半点关系,所以这时候Animal h=new Horse();会报错
转载于:https://www.cnblogs.com/zzzzw/p/4965017.html
java 子类重写父类的方法应注意的问题相关推荐
- java 子类重写父类的方法的注意事项
2019独角兽企业重金招聘Python工程师标准>>> 若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:重写方法不能比被重写方法限制有更严格的访 ...
- java 子类继承父类各方法的执行顺序
结论: java中子类继承父类各方法的执行顺序:(这里只写jvm自动调用的方法的顺序,包括静态代码块.代码块.构造方法) 1.第一次创建子类对象 父类静态代码块 子类静态代码块 父类代码块 父类构造方 ...
- java子类调用父类的方法
当一个类继承于另一个类,子类中没有父类的方法时,用子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...
- java如何调用父类的实例对象_java子类调用父类的方法中包含子类重写的实例方法...
java子类调用父类的方法中包含子类重写的实例方法 # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static ...
- 关于子类重写父类方法的问题
关于访问修饰符对重写父类方法的影响 结论 代码样例 子类 结论 子类重写父类的方法: 1.父类中私有方法不能被重写.因为父类私有方法子类可理解为被子类继承,但是不被子类可见,不可访问,当然就无法重写了 ...
- Python OOP:继承、单继承、多继承、__mro__、子类重写父类同名属性和方法、子类调用父类同名属性和方法、多层继承、super()、私有(实例)属性和方法、获取修改私有属性值、私有类属性
一.继承 Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法. 继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 在P ...
- java 调用父级方法_java子类调用父类的方法是什么
java子类调用父类的方法:1.子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找:2.如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找 ...
- java多态实现示例,以及子类重写父类方法调用父类方法
多态 多态存在的三个必要条件:继承,重写,父类引用指向子类对象, 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则error:如果有,调用子类的同名方法. example: pack ...
- java子类可以修改父类成员吗_子类重写父类成员方法
最近在学习到Java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得. 首先要明确:子类是不能够覆盖(重写)父类的私 ...
最新文章
- Kafka史上最详细原理总结 ----看完绝对不后悔
- Sublime Text 3中文乱码问题的解决(最有效)
- XXL-Job分布式任务调度
- 空间金字塔Spatial Pyramid的BOW和Pyramid HOG的多核
- 静态库与动态库(一):概述
- ASP.NET Core Middleware
- 唯有自己变得强大_物竞天择,适者生存,唯有强大自己,方能百毒不侵
- 用Python 操作Web 前端 基础 1
- 苹果手机长截屏_涨知识了!原来苹果手机也可以长截屏,还不知道的,快来学一学...
- Chrome 启动页面被114篡改的修复
- 破解docx文档保护密码
- 一个迷茫的应届生程序员
- 使用Docker安装MySQL
- java-net-php-python-jspm智守护学生健康管理系统软件设计与开发计算机毕业设计程序
- 万能乘法速算法大全_小学数学各年级知识点和重点、难点大全,复习必备提纲!...
- 计算机软考证书全面分析
- 论文研读-多目标优化中的多源选择迁移框架
- GrayLog 设置日志保留时间每天1个索引,保留183天(6个月)
- 西北大环线旅游 7 天、2400 公里的所见所闻
- 尚硅谷在线教育十四:微信支付