【笔记】多态之Override

Override是子类与父类多态性的表现。

 

关于Override需要注意几点地方:

1.被覆盖方法的访问控制级别可以不一样。 

但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

 

2.方法被定义为private或static或final的则不能被覆盖。 

3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。 

4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。 

 

然后让我们看一个坑爹的例子:

package learn;
public class Parent {  
      
    private  int num(int i,int j){  
        return i+j;  
    }  
      
    public static void main(String[] args) {  
        Parent p = new Child();  
        System.out.println(p.num(1, 2));  
    }  
}  
class Child extends Parent{  
      
    public int num(int x,int y){  
        return x-y;  
    }  
} 

得出的结果是:3

因为Parent中的num()方法是私有函数,所以Child类中的num()并不是继承Parent中的num()方法。

而p的的类型是Parent,因此调用p的num()时,使用的是父类的num()方法。

 

那如果将p的构造方法替换一下

Child p = new Child();

这时得到的结果是:-1

 

如果将父类中num()方法的修饰符给修改一下

package learn;
public class Parent {  
      
    protected   int num(int i,int j){  //这里
        return i+j;  
    }  
      
    public static void main(String[] args) {  
        Parent p = new Child();  //和这里
        System.out.println(p.num(1, 2));  
    }  
}  
class Child extends Parent{  
      
    public int num(int x,int y){  
        return x-y;  
    }  
} 

因为父类中num()方法的修饰符变成了protected,这样子类就能覆盖父类中的方法,

因此在调用时会优先调用子类的方法。

得到的结果是:-1

 

 

posted @ 2012-09-22 11:05  のんきネコ  阅读(282)  评论(0编辑  收藏  举报