A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄长利 中级黑马   /  2012-4-13 22:02  /  7642 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 呢?




评分

参与人数 1技术分 +2 黑马币 +10 收起 理由
贠(yun)靖 + 2 + 10 非常给力啊~~~!3q

查看全部评分

8 个回复

倒序浏览
子类覆盖父类的方法时:子类方法返回的类型应该比父类方法返回的类型更小或相等
回复 使用道具 举报
这个覆盖时,返回值类型,参数列表个数,方法名必须一致!!!
但是哥们,你父类用的类型是上帝啊!!
你父类换个类型肯定是不行的。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
什么叫覆盖?
覆盖的方法的标志必须要和被覆盖的方法的标志完全一样,也就是定义方法的那一行必须是一模一样,才叫覆盖;
子类的返回值类型必须和父类的返回值类型一样!
如果是其他的返回值类型 那就不叫覆盖!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
覆盖是指派生类中存在重新定义的函数,其函数名,参数列表,返回值类型必须与父类中的相对应的被覆盖函数保持严格的一致,覆盖函数和被覆盖函数只有函数体不同。当派生类对象调用子类中该同名函数时,会自动调用子类中的覆盖版本,而不是父类中被覆盖的版本,这种机制称为覆盖。也就是说,覆盖的意义是调用子类中的覆盖函数,而不是父类中的被覆盖函数。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

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";
        }
}
你这样写并不是将父类重写了,而是在子类中定义了两个同名但是返回值类型不同的方法。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
协变式覆盖:
在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:49
8#
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:01
9#
本帖最后由 张亮 于 2012-5-31 12:22 编辑

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