検索

ホームページ  >  に質問  >  本文

关于java中继承静态方法的问题

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()方法的调用与什么有关?

PHPzPHPz2900日前523

全員に返信(3)返信します

  • ringa_lee

    ringa_lee2017-04-18 09:44:18

    静的メソッドの場合、invokestatic 命令が使用されます。invokestatic 命令は、静的メソッドのシンボル参照のみを必要とします。そのため、静的メソッドはコンパイル時に指定されます。 print メソッドの一部の単語 セクションコード:

    リーリー

    ご覧のとおり、invokestatic は Base.showme が呼び出されるように指定されているため、print メソッドの呼び出し方法によって invokestatic の動作は変わりません。

    さらに、質問者は静的バインディングと動的バインディングについて間違った理解を持っているように感じます: Java、コンストラクターでの多態性メソッドの呼び出し

    返事
    0
  • 怪我咯

    怪我咯2017-04-18 09:44:18

    サブクラスは親クラスの静的プロパティと静的メソッドを継承できますが、静的メソッドをオーバーライドすることはできません。
    親クラスと同じメソッド タグ (同じメソッド名、同じパラメータの型、同じ戻り値の型、さらには同じアクセス レベル) を持つメソッド ラベルがサブクラスにある場合、それは単に、親クラスの静的メソッドのオーバーライドではなく、親クラスと同じ名前の静的メソッドがサブクラス用に作成されます。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:44:18

    @kylewang が指摘したように、print メソッド部分のバイトコード

    リーリー

    メソッド呼び出しは Base.showme() として明確に指定されています

    返事
    0
  • キャンセル返事