[英]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繼承自其直接超類和直接超接口超類和超接口的所有
abstract
和non-abstract
方法,這些方法在與C相同的包中以default
訪問方式public
,protected
或聲明,並且都不會被覆蓋(§8.4.8.1並且在課堂上的聲明中也沒有隱藏(§8.4.8.2)。
沒有關於不繼承靜態方法的信息,這就是為什么你可以通過Test2
類運行在Test1
聲明的main
(它被繼承)。
如果一個類聲明了
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.