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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘云龙 中级黑马   /  2013-3-12 22:53  /  1615 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

覆盖时,覆盖函数和被覆盖函数的返回值关系,是一定要保持一样?
还是覆盖函数返回值范围要小于或等于被覆盖函数的返回值?
返回值为基本类型时,我已经知道了.
请问返回值为引用时,情况是怎样的?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
1、子类的方法的权限必须大于或等于父类才能覆盖,不然编译失败。

2、静态只能覆盖静态。

3、子父类方法要一模一样(返回值类型,函数名,形参)。
引用类型也是类吧,比如返回
public person getPerson(){
       Person p = new Person();
    return p;

}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
*** 覆盖的前提是子类与父类方法名,返回值类型一样,参数类型名,个数要一致,还要确保父类方法的权限被子类访问的到。
***因为我们所说的覆盖其实就是复写。是针对java类中的方法来说的。覆盖存在于继承里面,子类建立自己的对象,并继承父
      类的方法,复写父类的功能,并形成自己的功能。
这里的关键在于1.要有继承关系  2.子类有访问父类的权限 3.子类父写父类方法时,除了功能有扩展,其它的要完全一致(包括:方法名,返回值类型,参数类型名,个数)

所以哈。返回值类型必须是完全一致的,不存在范围小于还是大于。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
樊玲 发表于 2013-3-12 23:15
*** 覆盖的前提是子类与父类方法名,返回值类型一样,参数类型名,个数要一致,还要确保父类方法的权限被子 ...

美女作答啊:D
回复 使用道具 举报
重写(覆盖):在子类中有一个与父类同名的方法(返回值类型,参数列表一样包括参数的个数,类型,顺序)
重写目的:子类可以对父类中的方法进行功能扩展.
1.子类重写的方法不能使用比父类的方法更严格的修饰符,也就要大于等于父类的修饰符。
2.静态只能重写静态.
所以无论基本类型还是引用类型,返回值类型必须相同,否则不是重载。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
曹春贵 发表于 2013-3-12 23:22
美女作答啊

;P。。。。
回复 使用道具 举报
如果子类的覆写父类方法时,返回值是父类返回值的子类可以吗?
比如:父类返回值是Person,子类覆写父类的方法,但是返回值是Person的子类,这样可以吗?
回复 使用道具 举报
yhnan 中级黑马 2013-3-13 12:56:07
8#
覆盖:子父类方法要一模一样
如果子类要复写父类方法必须和父类一样 ,如果返回值是其他的就不是复写而是子类特有的方法
回复 使用道具 举报
本帖最后由 刘云龙 于 2013-3-14 21:25 编辑
樊玲 发表于 2013-3-12 23:15
*** 覆盖的前提是子类与父类方法名,返回值类型一样,参数类型名,个数要一致,还要确保父类方法的权限被子 ...

不知道你有没有测试过,我的结论是子类的返回值可以是父类返回值的子类
看下边的例子:
/*
子类继承父类后,覆写父类方法,返回值问题
结论:
子类覆写父类方法后,返回值(引用类型)可以是父类方法返回值的子类
*/
class ExtendsFanHuiTest
{
        public static void main(String[] args)
        {
                new Zi().show();
        }
}
abstract class Fu
{
         public Object show()
         {
                System.out.println("Fu show()");
                return new Object();
          }
          public abstract Big function();
}
class Zi extends Fu
{
           @Override//为了确定却是是
           public String show()//此处Zi类继承了Fu类的方法,但是返回值不同,Fu类返回Object,而子类返回其Object的子类String类,编译可以通过,且可以运行
           {
                  System.out.println("Zi show()");
                  return new String();
            }
            @Override
            public Little function()//此处Zi类继承了Fu类的方法,但是返回值不同,是Fu类返回值的子类,
            {
                   return null;
            }
}
//下边是随便写的两个类,存在继承关系
class Big
{
}
class Little extends Big
{
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马