黑马程序员技术交流社区

标题: 子类覆盖父类方法返回值类型问题 [打印本页]

作者: 黄长利    时间: 2012-4-13 22:02
标题: 子类覆盖父类方法返回值类型问题
class Fu
{
        public Object show()
        {
                return "fulei";
        }
}

public class FuGai extends Fu
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
                System.out.println(new FuGai().show());
        }
        public String show()
        {
                return "zilei";
        }
}
子类覆盖父类方法时,需要和父类的方法名,参数个数及类型一致,还有返回值类型也要一致,
在上示代码中,子类覆盖的方法与父类的返回值类型并不相同,
是不是只要子类的返回值类型是父类方法的返回值类型,或者是该类型的子类都 ok 呢?





作者: 黑马-刘昌文    时间: 2012-4-13 22:15
子类覆盖父类的方法时:子类方法返回的类型应该比父类方法返回的类型更小或相等
作者: 石好强    时间: 2012-4-13 22:15
这个覆盖时,返回值类型,参数列表个数,方法名必须一致!!!
但是哥们,你父类用的类型是上帝啊!!
你父类换个类型肯定是不行的。
作者: 黄小钒    时间: 2012-4-13 22:21
什么叫覆盖?
覆盖的方法的标志必须要和被覆盖的方法的标志完全一样,也就是定义方法的那一行必须是一模一样,才叫覆盖;
子类的返回值类型必须和父类的返回值类型一样!
如果是其他的返回值类型 那就不叫覆盖!
作者: 黄小钒    时间: 2012-4-13 22:24
覆盖是指派生类中存在重新定义的函数,其函数名,参数列表,返回值类型必须与父类中的相对应的被覆盖函数保持严格的一致,覆盖函数和被覆盖函数只有函数体不同。当派生类对象调用子类中该同名函数时,会自动调用子类中的覆盖版本,而不是父类中被覆盖的版本,这种机制称为覆盖。也就是说,覆盖的意义是调用子类中的覆盖函数,而不是父类中的被覆盖函数。

作者: 欧阳才志    时间: 2012-4-13 22:27

class Fu
{
        public Object show()//父类返回的类型是根类型
        {
                return "fulei";
        }
}

public class FuGai extends Fu
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
                System.out.println(new FuGai().show());
        }
        public String show()//子类重写后返回的类型是字符类型
        {
                return "zilei";
        }
}
你这样写并不是将父类重写了,而是在子类中定义了两个同名但是返回值类型不同的方法。
作者: 黄长利    时间: 2012-4-13 22:44
协变式覆盖:
在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。这样有什么好处呢?以Object类的clone方法为例:


class Object {
...
public Object clone() { ... }
}
在5.0以前,如果子类需要重载clone方法,必须像下面这样写代码:


class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Object clone() { return new Point(x,y); }
}
虽然在我们的Point类里,clone方法总是返回一个Point类型的对象,但却必须把返回类型写成Object,在外部使用clone方法时也必须使用恼人的强制类型转换。
在Java5.0以后,我们就可以利用新的覆盖规则,像下面这样编写代码:


class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Point clone() { return new Point(x,y); }
}
这样,我们就可以直接使用Point p2 = p1.clone(); 而不用强制类型转换了。
作者: 马强    时间: 2012-4-13 22:49
class Fu
{
        public Demo show()   //父类的类型决定了子类要覆盖的返回值类型,object包括一切,如果这里我们用返回值的类型也是类似于object和子类的类型

        {
                return new Demo2();
        }
}

public class Practice extends Fu
{

        public static void main(String[] args)
        {
                System.out.println(new Practice().show());
        }
        public Demo1 show()
        {
                return new Demo1();
        }
}
class Demo
{
}

class Demo1 extends Demo
{
}
class Demo2 extends Demo
{
}
作者: 张亮    时间: 2012-4-14 12:31
本帖最后由 张亮 于 2012-5-31 12:22 编辑

虽然大家回答的很好很细了。我还是想回答一下。
简明扼要的说,子类返回值类型,要么和父类方法的返回值类型相同,要么子类的返回值类型是父类返回值类型的子类。
具体你可以看看这个帖子,写得很详细。
子类覆盖父类方法1.5新特性~~~~! 大家看看是否有其他解释...
http://bbs.itheima.com/forum.php ... 11835&fromuid=12388





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2