[英]Origin of Java syntax for creating new instance of an inner class?
我很好奇在給定 Java 中的外部 class 實例的情況下,實例化內部 class 的語法選擇。
語法是:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
但為什么不是:
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
前者似乎暗示 new 是與 class 直接關聯的方法或運算符,但我的理解是情況並非如此(與 C++ 不同)?
后者對我來說意味着類型名稱是outerObject.InnerClass
- 而實際上類型名稱只是InnerClass
(或OuterClass.InnerClass
,這也是合法的)構造與outerObject
引用的實例相關。
就我個人而言,我不喜歡 Java 首先做嵌套類的方式,我同意它看起來有點奇怪,但我明白為什么會這樣做。
還有一個原因。
new o.C();
有兩種可能的含義。 這可能意味着在外部 object o 的上下文中創建內部 class C
o
。 它也可能是創建一個 class ,其完全限定名稱為o.C
。 這種模棱兩可是有問題的,特別是因為兩種解釋可能同時有效。
內部 class 在所有方面都是外部 class 的固有部分的子集。 內部 class 可以訪問所有外部類的成員,就好像它們是一個一樣。 同樣,(非static
)內部 class 的實例必須是外部 class 實例的內在部分。 它不能單獨存在。 您可以將其與無法使用MyClass.wyVariable
訪問非靜態變量或 function 進行比較。
這提出了哪種方式是表示這種關系的最語義正確方式的問題。
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
... 將(語義上)斷言 InnerClass 以某種方式是InnerClass
的屬性,一旦獲取,就可以在 outerObject 的outerObject
之外的世界中自由outerObject
。 在這種情況下, new
的沒什么特別的。
而是 InnerClass 是InnerClass
的一部分,而InnerClass
的實例必須是OuterClass
實例的OuterClass
。
上面的語法表示InnerClass
(class 本身)是OuterClass
某些實例的一部分,這在語義上是不正確的。 畢竟只有一個 class InnerClass
,即使這個 class 可能有任意數量的實例。
OuterClass.InnerClass innerObject = new OuterClass.InnerClass();
... 當然,對於非static
內部類(在語義上)也不正確,因為它絕不代表內部和外部 class 實例之間的特殊愛和關懷關系。
但是請注意,這種語法對於static
內部類來說非常合適,因為它們與外部 class 的任何一個實例都沒有特殊關系。 在其外部 class 內部實例化內部 class 時,它也非常好。
最后,
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
... 象征着更好的關系。 它象征着實例化過程唯一地綁定到單個特定的外部 object,就是這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.