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

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 方法的部分字節碼:

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,在構造器裡調用多態方法

刘奇

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

Ty80

正如 @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()了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板