4 回答

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
因為內(nèi)部類的實例與其外部類的實例隱式關(guān)聯(lián),所以它本身不能定義任何靜態(tài)方法。由于靜態(tài)嵌套類不能直接引用其封閉類中定義的實例變量或方法,因此它只能通過對象引用來使用它們,在靜態(tài)嵌套類中聲明靜態(tài)方法是安全的。

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
在非靜態(tài)內(nèi)部類中允許靜態(tài)方法沒有多大意義; 你怎么去訪問它?您無法訪問(至少最初)非靜態(tài)內(nèi)部類實例而無需通過外部類實例。創(chuàng)建非靜態(tài)內(nèi)部類沒有純粹的靜態(tài)方法。
對于外部類Outer,您可以訪問如下靜態(tài)方法test():
Outer.test();
對于靜態(tài)內(nèi)部類Inner,您可以innerTest()像這樣訪問其靜態(tài)方法:
Outer.Inner.innerTest();
但是,如果Inner不是靜態(tài)的,那么現(xiàn)在沒有純粹的靜態(tài)方法來引用該方法innertest。非靜態(tài)內(nèi)部類與其外部類的特定實例相關(guān)聯(lián)。函數(shù)與常量不同,Outer.Inner.CONSTANT因為對函數(shù)調(diào)用Outer.Inner.staticFunction();不保證引用是明確的。假設(shè)您有Inner.staticFunction()那些getState()定義的調(diào)用Outer。如果您嘗試調(diào)用該靜態(tài)函數(shù),則現(xiàn)在對Inner類有一個不明確的引用。也就是說,你在內(nèi)部類的哪個實例上調(diào)用靜態(tài)函數(shù)?這很重要。看,由于對外部對象的隱式引用,沒有真正的靜態(tài)方法來引用該靜態(tài)方法。
保羅貝洛拉是正確的,語言設(shè)計師可以允許這樣做。然后,他們必須小心地禁止對非靜態(tài)內(nèi)部類的靜態(tài)方法中對外部類的隱式引用的任何訪問。在這一點上,如果你不能引用外部類,除了靜態(tài)之外,這是一個內(nèi)部類的值是什么?如果靜態(tài)訪問沒問題,為什么不將整個內(nèi)部類聲明為靜態(tài)呢?如果你只是讓內(nèi)部類本身是靜態(tài)的,那么你沒有對外部類的隱式引用,并且你不再有這種歧義。
如果您確實需要非靜態(tài)內(nèi)部類的靜態(tài)方法,那么您可能需要重新考慮您的設(shè)計。
添加回答
舉報