Java的静态方法重写问题

来源:互联网 发布:mac一体机安装win7 编辑:程序博客网 时间:2024/05/07 05:38

"重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(形式上被重写了,但是不符合的多态的特性),“重写”是用来实现多态性的,只有实例方法是可以实现多态,而静态方法无法实现多态。例如:

        Employee man = new Manager();

        man.test();

   实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,就是Employee类型的man变量的指针指向了一个Manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用Employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从Manager类的那个对象上走的,所以调用的方法实际上是Manager类的方法。有这种结果关键在于man实际上指向了Manager类对象。现在用man来调用静态方法,实际上此时是Employee类在调用静态方法,Employee类本身肯定不会指向Manager类的对象,那么最终调用的是Employee类的方法。

   由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果,从多态的角度可以认为子类实际上是写了一个新方法,从这个角度上说静态方法无法被重写。那么也就证明了重写和覆盖就是一回事。

例如:

[java] view plaincopy
  1. public class TestStaticMethodExtends {  
  2.       
  3.     public static void main(String[] args) {  
  4.        A a = new B();  
  5.         a.p();  
  6.     }  
  7. }  
  8.   
  9. class A {  
  10.     public static void p() {  
  11.         System.out.println("基类");  
  12.     }  
  13. }  
  14.   
  15. class B extends A {  
  16.     public static void p() {  
  17.         System.out.println("子类");  
  18.     }  
  19. }  
  20.   
  21. 输出:基类  

0 0
原创粉丝点击