[英]Why can't I access an inner static class in java with class object
當我使用類的實例訪問靜態成員時,它可以工作,那么為什么靜態內部類會出錯?
在 C++ 中,我們可以使用實例以及類名訪問靜態成員。
它在 Java 中有何不同。
class OuterClass{
static public int x;
public static void show(){
System.out.println(x);
}
public static class InnerClass{
static public int y;
}
}
public class MyApp {
public static void main(String[] args){
OuterClass obj = new OuterClass();
obj.x= 5;
System.out.println(obj.x); // This runs fine
obj.InnerClass.y = 10; // Error
System.out.println(obj.InnerClass.y);
OuterClass.InnerClass.y=10; // This works why ?
System.out.println(OuterClass.InnerClass.y);
}
}
如果這是一個愚蠢的問題,我很抱歉,Java 新手希望您理解。
問候
obj.x = 5; System.out.println(obj.x);
是的,這有效,但“偶然”。 Java語言規范允許這一點,但請注意,每個掉毛工具在那里,和Java當前的核心工程團隊,都會告訴你,這是不好的代碼風格,你不應該這樣做。
在羅馬時,就像羅馬人一樣:如果您更喜歡這種代碼風格,那是……無關緊要。 不要寫這個。 你不是在自己的小泡泡里,你讀的是別人寫的代碼,別人會讀你寫的代碼並使用你寫的代碼。
在 java 中仍然允許這樣做的唯一原因是因為 java 不喜歡破壞向后兼容性。
它很someExpr.someThing
的原因是someExpr.someThing
強烈暗示someExpr
以任何方式或形式相關。 就像在運行時一樣, someExpr
被評估,並且它指向的任何對象(請記住,在 Java 中,除原語之外的所有變量都像 C 指針,但在 Java 中我們稱它們為引用。Potayto Potahto)然后用於獲取該對象字段或調用該方法。
但如果someThing
是一個靜態概念,則不會發生這種情況:為了簡單證明這一點,將someExpr
null 並注意它是如何工作的(沒有拋出 NullPointerException),從而證明沒有發生解引用。
這很混亂。 如果someThing
是靜態的,那么它屬於該類而不是它的任何特定實例,所以這樣寫: OuterClass.x
。
obj.InnerClass.y = 10; System.out.println(obj.InnerClass.y);
是的,錯誤。 雖然您可以通過編寫x.fieldOrMethod
來引用靜態方法和靜態字段,其中 x 是一個表達式,其靜態(編譯時,而不是運行時)類型是具有fieldOrMethod
作為字段或方法成員的類型,但它有效,但如果不是是內部類型。 為什么? 因為java規范是這么說的。
請注意,內部類型是在 java 1.1 中添加的,我很確定 lang 團隊已經意識到允許obj.staticThing
是一個設計錯誤,因此他們故意決定不擴展和延長該錯誤。 它是在火上,為什么你不應該讓一個習慣了這種風格的進一步燃料; 它並不能始終如一地工作。
OuterClass.InnerClass.y=10; System.out.println(OuterClass.InnerClass.y);
最后我們得到正確的代碼。 不僅它有效,而且這就是你應該這樣做的方式。 OuterClass.InnerClass
是將InnerClass的名字:指剛上課的時候所有的類都在影響“靜態”:這並不是說有將InnerClass的一個變體為在OuterClass(不即使是將InnerClass非靜態)的每個實例:在概念“InnerClass”只存在一次。 無論 InnerClass 是否為靜態,只有一個java.lang.Class<?>
實例來表示“InnerClass”。 你還有什么其他的方式來引用InnerClass
? obj.InnerClass
意義為零——引用 InnerClass 不需要 obj 的實例——提供不相關和未使用的信息(在這種情況下, obj
引用)是很奇怪的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.