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() として明確に指定されています