本帖最后由 贠(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(); 而不用强制类型转换了。
测试了一下- public class rr {
- private int x = 10;
- public static void main(String[] args){
- B b = new B();
- rr r = b.method();
- System.out.println(r);
- System.out.println(r.x);
- }
- }
- class A
- {
- public Object method(){
- System.out.println("aaa");
- return new A();
- }
- }
- class B extends A
- {
- public rr method(){
- System.out.println("bbbb");
- return new rr();
- }
- }
复制代码 比如你父类 定义的List method()方法 返回List 的引用 对象
子类覆盖它为 ArrayList method()
返回具体的子类对象 这样子类返回的对象在调用子类特有的方法时, 就不需要强转了
如果不可以的话 在子类覆盖它
返回的还是List list = new 子类() 而你用这个引用调用
list子类的对象的特有方法 就得强转了
由黄长利同学提供,大家感谢他吧 呵呵~~~!
|
|