簡體   English   中英

為什么我不能使用類對象訪問java中的內部靜態類

[英]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.

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