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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王松朝 金牌黑马   /  2011-7-24 17:35  /  2539 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在网上看到这样一句话"java SE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型"
没看懂这句话是什么意思,最后的'导出类型'是什么

1 个回复

正序浏览
黑马网友  发表于 2011-7-24 18:10:31
沙发
在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。[code=java]public class Demo {
        public static void main(String[] args) {
                A a = new B();
               
                C c = a.display() ;
                c.display() ;
               
        }
}

class A {
        public C display() {
                System.out.println("this is from A!");
                return new C();
        }
}

class B extends A {
        public D display() {
                System.out.println("this is from B!");
                return new D() ;
        }
}

class C {
        public void display() {
                System.out.println("this is from C!!!");
        }
}

class D extends C {
        public void display() {
                System.out.println("this is from D!!!");
        }
}[/code]这个是可以编译通过的。

D继承C重写了display()方法,返回的都是void类型。
B继承A,都写了display()方法,但是类型看似乎不一样,一个返回的是类C,一个是继承了类C的类D,这里就是协变返回了。

结果为:[code=java]this is from B!
this is from D!!![/code]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马