規則對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.什麼讓你覺得「重載方法使用靜態綁定」? –