关于java中继承静态方法的问题
PHPz
PHPz 2017-04-18 09:42:18
0
3
512

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

PHPz
PHPz

学习是最好的投资!

全員に返信(3)
左手右手慢动作

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

リーリー

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

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

いいねを押す +0
刘奇

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

いいねを押す +0
Ty80

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

リーリー

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート