规则对Java绑定:
1)调用一个静态方法是静态绑定。
2)调用构造函数是静态绑定的。
3)呼叫,以非静态方法是动态绑定:
例外: 3.A)调用私有的,非静态方法是静态绑定。
3.b)在子类中调用使用super
的非私有非静态方法也是静态绑定的。
因此对于第一个问题即没有被覆盖的实例方法是否使用静态绑定?
答案是No.如果该方法没有被覆盖,但它可以(将来)。因为它是一个实例方法,所以它可以使用实例(动态绑定)或使用超级(静态绑定)调用。
第二个问题:为什么重载方法使用静态绑定,因为它们是虚拟的,可以在子类中重写?
答案:没有这样的事情,重载的方法是静态绑定的。
说明:
class Sample{
public void method1(){
System.out.println("hello from A");
}
public void method1(String user){
System.out.println("hello "+user+" from overloaded method");
}
public static void main(String []argh){
Sample s = new Sample();
s.method1();
s.method1("name");
}
}
在上面的代码中,该方法method1()
过载,但因为它既不是静态的,最终也不私有的,所以它产生invokevirtual指令,这意味着它被动态地绑定不是静态的。
要清除的结合的差异,调度是指这个Question
1号堂妹可能被别人取代。编译器不会知道一个方法没有被覆盖。例外是私有方法和最终方法,至少前者是静态绑定的。 2.什么让你觉得“重载方法使用静态绑定”? –