Base父类代码如下
public class Base {
public static String showme(){
return "Base";
}
public void print(){
System.out.println(showme());
}
}
Sub子类代码如下
public class Sub extends Base {
public static String showme(){
return "Sub";
}
}
main函数如下
public class AppMain {
public static void main(String args[]){
Base base=new Sub();
base.print();
Sub sub=new Sub();
sub.print();
}
}
打印结果两个都为Base
请问怎样解释在print方法中showme()方法的调用与什么有关?
對於靜態方法而言使用的是invokestatic 指令調用,invokestatic 指令並不需要實例引用作為操作數,只需要靜態方法的符號引用,所以靜態方法在編譯期就已經指定了,print 方法的部分字節碼:
可以看到,invokestatic 就已經指定了呼叫的是 Base.showme,所以你如何呼叫 print 方法都不會改變 invokestatic 的行為。
另外,我感覺題主對靜態綁定與動態綁定的理解有誤,建議題主參考這個問題:Java,在構造器裡調用多態方法
子類別可以繼承父類別的靜態屬性和靜態方法,但是不可以重寫靜態方法。
在子類別中有一個與父類別具有相同方法標籤(方法名稱相同,參數類型相同,返回值類型相同,甚至連訪問等級也相同),也只能說明是對子類別又新建了一個與父類別同名的靜態方法,而不是對父類別的靜態方法的重寫.
正如 @kylewang 指出的print方法部分字節碼
方法呼叫以及明白的指定了是Base.showme()了