方法重写可不可以改变返回值的类型?如果不可以,那以下代码又怎么解释呢?
class A {
public Object fun() {
return null;
}
}
class B extends A {
public String fun() {
return null;
}
}
class A {
public Object fun() {
return null;
}
}
class B extends A {
public String fun() {
return null;
}
}
比如你举那个例子是类型Object->String是有继承关系的,
你可以试试把TestA中函数换成Integer试试,就不行了,因为Integer->String没有继承关系。虽然有隐含的类型转换,建议还是写成一致比较好。
应为父类的的类型是object,任何类都是继承了object,我们大家都知道子类是可以当做父类来使用的。这个就是原因。
这个问题主要是对 类型一致 这个概念的理解问题
一般认为类型一致就是要完全一对致。
可是通过这个例子看JVM并不是这样理解的。
只要类型转换可以通过JVM似乎就理解为类型一致了。看来JVM还是比较宽容的啊!!!
专门找来 重写的定义 请您规范应用 您前面的解释是对的 但是 那么些是给自己找麻烦 明白否?
规范是什么 规范以为着安全
楼上无数人解释重写 说实在 真是多余!
终于解决了
思想吗? 都是用自己所学的知识来解释如何编译通过的!并且部分解释的都很不错! 举一反三吧!
我在eclipse里面写了,编译不能通过!
大家说的都有道理,可是我的就是不能通过啊!
所以上面的很明显可以通过编译,因为String是Object的子类。
至于上面的程序,我觉得因为String是object的一个子类所以还是可以的,如果换成两个没有继承关系的类型,那就不行了。。
就是说子类在复写父类的方法时,其返回值类型可以为父类中方法返回类型的子类所以LZ的这个代码是没有问题的
{
public Object/*Integer*/ fun()
{
return this;//new Integer(1);
}
}
class B extends A
{
public String fun()
{
return toString();
}
public String toString(){
return "b";
}
}
public class Demo{
public static void main(String[] args){
A b =new B();
System.out.println(b.fun());
}
}
Java里面Override的返回值是否必须和父类相同?
String是可以的,但是int double等基本类型就是不可以的!
下面这一个也是可以通过的public class A
{
public Object fun(String s)
{
return "object";
}
}public class B extends A
{
public Integer fun(String s)
{
return 1;
}}
方法签名一样 那么就是同一个方法
所以这个是override
原因是因为多态,比如有两个类A和B,并且另外有两个类
class Father{
public A f(){
......
}
}class Sun extends Father{
public B f(){
......
}
}当多态时:
Father obj = new Sun();
......
A a = obj.f(); 这些代码在编译时应该是能通过的
但是,如果Father和Sun类的 f() 方法返回的类型没有联系,则在运行时类型将不兼容。
归纳起来:
方法重写的要点有(不全面,请大家再补充)
1)方法重写只针对实例方法,对于static方法,只有隐藏。没有重写这一说。
2)只有能被继承的实例方法才能被子类重写。
3)只有能被访问的方法,才会被继承。
4)方法重写时,方法的签名必须一样,但方法的返回值类型是:
(1)若是基本数据类型,则必须要相同。
(2)若是引用类型,则重写的方法的返回值类型或者一样,或者是被重写方法的返回值类型的子类型(正是这一点,对程序员设计代码很有用)。
5)重写方法时,不能抛出更多的异常
6)重写方法时,访问权限只能相同或更大,不能变得更小。
7)不能将父类的实例方法,在子类中“重写”成static方法。
8)不能将父类的static方法,在子类中“重写”成实例方法。
9)默认访问权限的实例方法,可能会被子类重写,也可能不能被子类重写(这要看该实例方法能否被继承)。因此:设计代码时尽可能避免这一点,不正确之处,请你修正并最好说明理由,这样大家才好共同提高。
重写可以改变返回类型,但只限于返回类型为对象,而且被重写的方法(A中方法)返回类型能够接收重写方法(B中方法)返回类型的对象,当然接口也是可以的。比如A返回一个接口,B返回实现这个接口的一个类对象。也是可以的。
没有这个东西,你到是重写Object类的protected Object clone()克隆(无论深克隆或浅克隆)来试试看。当然还有其它重要用途了