搜尋

首頁  >  問答  >  主體

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

PHPzPHPz2895 天前520

全部回覆(3)我來回復

  • ringa_lee

    ringa_lee2017-04-18 09:44:18

    對於靜態方法而言使用的是invokestatic 指令調用,invokestatic 指令並不需要實例引用作為操作數,只需要靜態方法的符號引用,所以靜態方法在編譯期就已經指定了,print 方法的部分字節碼:

    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    INVOKESTATIC com/kyle/Base.showme ()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

    可以看到,invokestatic 就已經指定了呼叫的是 Base.showme,所以你如何呼叫 print 方法都不會改變 invokestatic 的行為。

    另外,我感覺題主對靜態綁定與動態綁定的理解有誤,建議題主參考這個問題:Java,在構造器裡調用多態方法

    回覆
    0
  • 怪我咯

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

    子類別可以繼承父類別的靜態屬性和靜態方法,但是不可以重寫靜態方法。
    在子類別中有一個與父類別具有相同方法標籤(方法名稱相同,參數類型相同,返回值類型相同,甚至連訪問等級也相同),也只能說明是對子類別又新建了一個與父類別同名的靜態方法,而不是對父類別的靜態方法的重寫.

    回覆
    0
  • PHP中文网

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

    正如 @kylewang 指出的print方法部分字節碼

    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    **INVOKESTATIC** com/kyle/**Base.showme ()**Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V

    方法呼叫以及明白的指定了是Base.showme()了

    回覆
    0
  • 取消回覆