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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 贠(yun)靖 于 2012-4-13 23:18 编辑



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(); 而不用强制类型转换了。



测试了一下
  1. public class rr {
  2. private int x = 10;
  3. public static void main(String[] args){
  4.         B b = new B();
  5.         rr r = b.method();
  6.         System.out.println(r);
  7.         System.out.println(r.x);
  8. }


  9. }
  10. class A
  11. {
  12.            public Object method(){
  13.            System.out.println("aaa");
  14.            return new A();
  15.      }
  16. }
  17. class B extends A
  18. {
  19.       public rr method(){
  20.       System.out.println("bbbb");
  21.       return new rr();
  22.     }
  23. }
复制代码
比如你父类 定义的List method()方法 返回List 的引用 对象   
    子类覆盖它为  ArrayList method()
   返回具体的子类对象   这样子类返回的对象在调用子类特有的方法时, 就不需要强转了
如果不可以的话  在子类覆盖它
   返回的还是List  list = new 子类()    而你用这个引用调用
   list子类的对象的特有方法 就得强转了

由黄长利同学提供,大家感谢他吧  呵呵~~~!  

5 个回复

倒序浏览
感谢分享,我有个问题:子类方法的返回值是超类方法的子类型 ,那byte、short、int类型算不算long的子类型呢?
回复 使用道具 举报
本帖最后由 贠(yun)靖 于 2012-4-13 23:29 编辑
尹波 发表于 2012-4-13 23:20
感谢分享,我有个问题:子类方法的返回值是超类方法的子类型 ,那byte、short、int类型算不算long的子类型 ...


不行,刚测试了一下,错误提示是不兼容类型, 因他们之间没有继承关系
  只是取值范围不同  没有必然联系
回复 使用道具 举报
贠(yun)靖 发表于 2012-4-13 23:26
不行,刚测试了一下,错误提示是不兼容类型, 因他们之间没有继承关系
  只是取值范围不同  没有必然联系 ...

呵呵,知道了,谢谢~
回复 使用道具 举报
郑苑东 来自手机 中级黑马 2012-4-14 00:20:26
报纸
子类。是继承父类的。而且int等原生数据类型不存在所谓的继承。。他们各自有自己的包装类。包装类也不能。所谓的返回子类,,,是指你继承了你父类返回值的类。或者实现。。。
回复 使用道具 举报
感谢分享,不然我还一直停留在先前返回值类型一定要相同的层面上
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马