扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Java方法重写问题
方法重写可不可以改变返回值的类型?
如果不可以,那以下代码又怎么解释呢?
Java code
class A {
public Object fun() {
return null;
}
}
class B extends A {
public String fun() {
return null;
}
}
关于方法重写的一些特性:
1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
根据2,3条是不是能确定第一条,子类方法的返回值必须是父类方法返回值的子类。
返回类型应该是要一致的,不过JAVA也会做一个类型检查,只要是类型兼容就可以了。
比如你举那个例子是类型Object->String是有继承关系的,
你可以试试把TestA中函数换成Integer试试,就不行了,因为Integer->String没有继承关系。
虽然有隐含的类型转换,建议还是写成一致比较好。
关于方法重写的一些特性: 1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法) 2.子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常) 3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别) 根据2,3条是不是能确定第一条,子类方法的返回值必须是父类方法返回值的子类。 |
根据重写的定义看返回值是要类型一致的。
这个问题主要是对 类型一致 这个概念的理解问题
一般认为类型一致就是要完全一对致。
可是通过这个例子看JVM并不是这样理解的。
只要类型转换可以通过JVM似乎就理解为类型一致了。
在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
编译是可以通过的!上面的例子中子类对父类的方法返回类型并没有改写,只是“子类方法的返回值必须是父类方法返回值的子类”(引用4楼的话),String肯定是Object的子类,可以说子类已经成功的重写了父类的方法。但如果子类的返回类型是父类方法返回值类型的父类,将会编译错,如果子类用的是基本类型,也一样报错。
方法的重写不就是覆盖吗?返回值当然要一样,只是方法体不一样,子类方法覆盖了父类的方法,子类对象调用子类自己的方法,父类对象调用父类的方法,成员变量同名的情况下是“隐藏”,父类同名对象被隐藏,子类可以通过super来调用父类成员变量,方法同名的时候就是覆盖了!
方法的重写是子类对继承自父类的方法进行重新定义,并且方法名,返回类型,参数个数要与父类一致。 至于上面的程序,我觉得因为String是object的一个子类所以还是可以的,如果换成两个没有继承关系的类型,那就不行了
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。