日期:2014-05-20  浏览次数:20699 次

static 方法不能被重写??
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。

老外的话没看懂。。。。
大家帮忙解释,如果把上面程序中的红字去掉,就重写了??

------解决方案--------------------
static 方法不能被重写??
答:只能隐藏,不能重写
------解决方案--------------------
static方法又叫类方法所有对象共用同一个方法,不创建多份实例,调用的时候看的是你的引用。

去掉static才是真正的重写,调用时看的是对象的具体类型
------解决方案--------------------
文章不是说得很清楚了 static方法被调用了,JVM 不会检查什么类型正在指向它,它只会调用跟Base 类相关联的方法的
实例。去掉static JVM 会检查对象实际new出的类型 来判断调用什么方法 既多态机制
------解决方案--------------------
因为开始运行时,他最先初始化了,比调用构造方法这个过程还要早,存贮在固定的一个内存区域,已经开始使用了你让它怎么重写