簡體   English   中英

從父類調用main()方法

[英]Invoking main() method from parent class

有一個代碼:

class Test1{
    public static void main(String[] args){     
        System.out.println("Test1");
    }
}

class Test2 extends Test1{
}

當我嘗試執行java Test1我當然得到了這個:

測試1

但是,當我嘗試執行java Test2我仍然得到:

測試1

為什么? 在類Test2中不存在main()方法。 並且靜態方法不會繼承。 如果我將在Test2中添加main()(使用字符串“Test2”而不是“Test1”),我會得到:

TEST2

我理解為什么我在這個例子中得到了Test2。 但是如果在Test2類中不存在main(),我不明白為什么我會得到Test1。

並且靜態方法不會繼承。

靜態方法是繼承的。 看看jls-8.4.8繼承,覆蓋和隱藏

類C繼承自其直接超類和直接超接口超類和超接口的所有abstractnon-abstract方法,這些方法在與C相同的包中以default訪問方式publicprotected或聲明,並且都不會被覆蓋(§8.4.8.1並且在課堂上的聲明中也沒有隱藏(§8.4.8.2)。

沒有關於不繼承靜態方法的信息,這就是為什么你可以通過Test2類運行在Test1聲明的main (它被繼承)。


也來自jls-8.4.8.2隱藏(按類方法)

如果一個類聲明了static方法m ,則聲明m被稱為隱藏任何方法m ',其中m的簽名是m '簽名的子簽名(第8.4.2節),在超類和超接口中。該類中的代碼可以訪問的類。

因此,當您在Test2類中創建新的main方法時,您隱藏(而不是重寫) Test1.main方法,這就是您看到輸出的原因

Test2

靜態方法確實可以繼承。 這就是這里發生的事情。 防爆。 這很好用:

class Base {
    public static void saySomething() {
        System.out.println("Hi!");
    }
}

class Extended extends Base {
    public static void main(String[] args) {
        saySomething();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM