方法重写可不可以改变返回值的类型?如果不可以,那以下代码又怎么解释呢?
class A {
public Object fun() {
return null;
}
}
class B extends A {
public String fun() {
return null;
}
}

解决方案 »

  1.   

    如果你用B类对象调用fun()方法时,JVM如何判断你想调用那一个fun()呢?,所以编译器就不会让这样的代码通过编译。
      

  2.   

    本人用的jdk6.0,测试可以通过,想请教方法重写到底可不可以改变返回值的类型?
      

  3.   

    返回类型应该是要一致的,不过JAVA也会做一个类型检查,只要是类型兼容就可以了。
    比如你举那个例子是类型Object->String是有继承关系的,
    你可以试试把TestA中函数换成Integer试试,就不行了,因为Integer->String没有继承关系。虽然有隐含的类型转换,建议还是写成一致比较好。
      

  4.   

    可以编译过
    应为父类的的类型是object,任何类都是继承了object,我们大家都知道子类是可以当做父类来使用的。这个就是原因。
      

  5.   

    虽然能通过编译,但实际上B类是没有办法使用他的父类A的那fun()了。
      

  6.   

    根据重写的定义看返回值是要类型一致的。
    这个问题主要是对 类型一致 这个概念的理解问题
    一般认为类型一致就是要完全一对致。
    可是通过这个例子看JVM并不是这样理解的。
    只要类型转换可以通过JVM似乎就理解为类型一致了。看来JVM还是比较宽容的啊!!!
      

  7.   

    在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
    专门找来 重写的定义 请您规范应用 您前面的解释是对的 但是 那么些是给自己找麻烦 明白否?
    规范是什么 规范以为着安全
      

  8.   

    通过super.fun()是可以使用父类的方法啊,不过因为类型由大变小所以需要做一个强转而已,但是调用是可以做到的。
      

  9.   

    这不是重写,这是子类的一个新的method
      

  10.   

    编译是可以通过的!LZ的例子中子类对父类的方法返回类型并没有改写,只是“子类方法的返回值必须是父类方法返回值的子类”(引用4楼的话),String肯定是Object的子类,可以说子类已经成功的重写了父类的方法。但如果子类的返回类型是父类方法返回值类型的父类,将会编译错,如果子类用的是基本类型,也一样报错。
      

  11.   

    以前不行,java5以后可以了,但不知道具体是哪个更新的版本开始的
      

  12.   

    你们不要误导,刚查了一下,在java core第七版690页中明确写到,jdk5.0以后,覆盖方法可以返回原方法的了类型
      

  13.   

    谢了,本人没有java core第七版,只有core java第八版和编程思想第四版,以前读编程思想的时候好像隐隐约约,朦朦胧胧 的度过这句话,但是想找就是找不到,还是非常谢谢你,可怜的我机器上只有jdk5.0和jdk6.0,谁那装jdk1.4了,可不可帮忙测试下,能不能通过
      

  14.   

    其实啊 我明白楼主的意思了 楼主帖子题目该是 《谁那有1.4版本jdk 我要换jdk》
    楼上无数人解释重写 说实在 真是多余!
      

  15.   

    终于在java编程思想第八章中找到了,原来是 Java SE5 中的新特性:协变返回类型(表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。
    终于解决了
      

  16.   

    =。=! 都去面试了 应该对继承和多态比较了解了 这个貌似自己完全可以推导出来,难道楼上的那么多人 都是查了java编程
    思想吗? 都是用自己所学的知识来解释如何编译通过的!并且部分解释的都很不错! 举一反三吧!
      

  17.   

    以前确实没想到这类问题,学习了!!!5.0+JDK用@Override试试就知道此方法是不是重写了
      

  18.   

    编译没有通过啊,必须要修改返回类型的!
    我在eclipse里面写了,编译不能通过!
    大家说的都有道理,可是我的就是不能通过啊!
      

  19.   

    从JDK1.5开始子类重写父类的方法时,其返回值可以是父类中返回值的子类,这叫协变。
      

  20.   

    我可以证明,复写是可以改变返回参数的类型的,但是这个返回参数类型必须是被复写方法返回参数的子类。
    所以上面的很明显可以通过编译,因为String是Object的子类。
      

  21.   

    《JAVA编程思想》第4版中也有提到协变类型。
      

  22.   

    extends 继承   override 重写 
      

  23.   

    方法的重写是子类对继承自父类的方法进行重新定义,并且方法名,返回类型,参数个数要与父类一致。
    至于上面的程序,我觉得因为String是object的一个子类所以还是可以的,如果换成两个没有继承关系的类型,那就不行了。。
      

  24.   

    Java SE5之后加入了协变返回类型(covariant return types)
    就是说子类在复写父类的方法时,其返回值类型可以为父类中方法返回类型的子类所以LZ的这个代码是没有问题的
      

  25.   

    编了个程序测试了一下,可以看出情况是这样的:当你的子类的函数返回类型是父类的函数返回类型的子类时,编译依然可以通过,并且可以运行,此时依然实现了方法的override。当你子类和父类的放回类型不一致时,编译报错,说返回类型不匹配。class A
     { 
    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());
    }
    }
      

  26.   

    方法的重写不就是覆盖吗?返回值当然要一样,只是方法体不一样,子类方法覆盖了父类的方法,子类对象调用子类自己的方法,父类对象调用父类的方法,成员变量同名的情况下是“隐藏”,父类同名对象被隐藏,子类可以通过super来调用父类成员变量,方法同名的时候就是覆盖了!!!
      

  27.   

    &&&&&&nonono好像不行哦
      

  28.   

    为此专门写了一个博文,大家可以看看。
    Java里面Override的返回值是否必须和父类相同?
      

  29.   

    重写父类的方法(只要是父类返回类型的子类就行了):
    String是可以的,但是int double等基本类型就是不可以的!
      

  30.   

    子类重写父类的方法时 返回类型应该是父类返回类型的子类就可以了
    下面这一个也是可以通过的public class A
    {
        public Object fun(String s)
        {
            return "object";
        }
    }public class B extends A
    {
        public Integer fun(String s)
        {
            return 1;
        }}
      

  31.   

    恩 我只知道确定一个方法的特征的是 方法签名 
    方法签名一样 那么就是同一个方法
    所以这个是override
      

  32.   

    可以改变,但有个前提,那就是子类重写的方法返回类型必须是父类方法返回类型的子孙类
    原因是因为多态,比如有两个类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() 方法返回的类型没有联系,则在运行时类型将不兼容。
      

  33.   

    答:我都不明白,这么个基础问题,怎么就那么多人不清楚,以至于还要东查西查的呢?基础真的很重要啊。学习的时候,你们的老师肯定都会讲过的。
    归纳起来:
    方法重写的要点有(不全面,请大家再补充
    1)方法重写只针对实例方法,对于static方法,只有隐藏。没有重写这一说。
    2)只有能被继承的实例方法才能被子类重写。
    3)只有能被访问的方法,才会被继承。
    4)方法重写时,方法的签名必须一样,但方法的返回值类型是:
     (1)若是基本数据类型,则必须要相同。
     (2)若是引用类型,则重写的方法的返回值类型或者一样,或者是被重写方法的返回值类型的子类型(正是这一点,对程序员设计代码很有用)。
    5)重写方法时,不能抛出更多的异常
    6)重写方法时,访问权限只能相同或更大,不能变得更小。
    7)不能将父类的实例方法,在子类中“重写”成static方法。
    8)不能将父类的static方法,在子类中“重写”成实例方法。
    9)默认访问权限的实例方法,可能会被子类重写,也可能不能被子类重写(这要看该实例方法能否被继承)。因此:设计代码时尽可能避免这一点,不正确之处,请你修正并最好说明理由,这样大家才好共同提高。
      

  34.   

    10)private实例方法总是不能被继承的,因而总是不会被重写的。
      

  35.   

    返回类型应该是要一致的,不过JAVA也会做一个类型检查,只要是类型兼容就可以了。 
      

  36.   


    重写可以改变返回类型,但只限于返回类型为对象,而且被重写的方法(A中方法)返回类型能够接收重写方法(B中方法)返回类型的对象,当然接口也是可以的。比如A返回一个接口,B返回实现这个接口的一个类对象。也是可以的。
      

  37.   

    答:没有意义吗?意义不小啊。
    没有这个东西,你到是重写Object类的protected Object clone()克隆(无论深克隆或浅克隆)来试试看。当然还有其它重要用途了