MicroFish

Open & Open hits
随笔 - 33, 文章 - 2, 评论 - 4, 引用 - 0
数据加载中……

static方法不应该被重写

如果你认为重写只是在子类中简单的替换了一个方法,你就很容易认为static 方法也能
被重写。事实上,我有很多包含人们举例指明static 方法能被重写的代码的邮件。然而,这
些并没有考虑方法重写在运行时决定哪个版本的方法被调用的细节问题。下面的代码似乎表
明static 方法是怎样被重写的。
class Base{
   static void amethod(){
   System.out.println("Base.amethod");
   }
}
public class Cravengib extends Base{
   public static void main(String arg[]){
      Cravengib cg = new Cravengib();
      cg.amethod();
   }
   static void amethod(){
      System.out.println("Cravengib.amethod");
   }
}
如果你编译并运行这段代码,你会发现输出文本Cravengib.amethod,这似乎很好的指
明了重写。然而,对于重写,还有相对于在子类中使用一个方法简单替换另一个方法更多的
东西。还有运行时决定的方法基于引用的类的类型的问题,这可以通过制造正在被实例化的
类的引用类型(实例初始化语句的左半部分)来说明。
在上面的例子中,因为名字叫amethod 的方法与类发生了关联,而不是与特定的类的实
例相关联,它不在乎什么类型的类正在创建它,而仅仅在意引用的类型。因此,如果你在调
用amethod 前改变一下这一行,
Base cg= new Cravengib()
你就会发现当你运行程序时,你会得到输出:Base.amethod
cg 是一个类Cravengib 在内存中的一个Base 类型的实例的引用(或者指针)。如果一个static
方法被调用了,JVM 不会检查什么类型正在指向它,它只会调用跟Base 类相关联的方法的
实例。
与上面的情况相对比:当一个方法被重写时,JVM 检查通过引用正在指向的类的类型,
并调用此类型相关的方法。可以结束这个例子了,如果你将两个版本的amethod 方法改变为
非static,并依然创建类:
Base cg= new Cravengib()
编译并运行上述代码,你会发现amethod 已经被重写了,并且输出Cravengib.amethod。

posted on 2006-10-24 11:47 刘璐 阅读(820) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: