3 回答

TA貢獻1802條經驗 獲得超4個贊
您不能將變量名稱用作另一個變量的類型,而這正是您想要使用的objOut.Inner
。變量的類型是Inner
(或可選Outer.Inner
)。
因為Inner
是一個內部類,所以它與其外部類的實例(其封閉實例)相關聯。當您創建它的實例時,您可以選擇指定與它關聯的對象實例,這就是您正在使用objOut.new Inner
.
這個例子可能會讓它更清楚一些:
public class Example {
? ? private String str;
? ? public class Inner {
? ? ? ? void show() {
? ? ? ? ? ? // Show the string for the Example this Inner is part of
? ? ? ? ? ? System.out.println(Example.this.str);
? ? ? ? }
? ? }
? ? public Example(String s) {
? ? ? ? this.str = s;
? ? }
? ? public static void main(String[] args) {
? ? ? ? Example e1 = new Example("e1");
? ? ? ? Example e2 = new Example("e2");
? ? ? ? Inner i1 = e1.new Inner();
? ? ? ? i1.show(); // "e1"
? ? ? ? Inner i2 = e2.new Inner();
? ? ? ? i2.show(); // "e2"
? ? }?
}
請注意該i1
?Inner
實例如何獲取e1
其封閉Example
實例,因此看到e1
s?str
,但又如何i2
獲取e2
其封閉實例,因此它看到e2
s?str
。
有時候它不是可選的,例如在我Example
上面的類中,因為new Inner
使用了 where ,所以沒有可以使用的默認實例。它在 的實例方法中是可選的Example
,但在該static
方法中不是可選的。

TA貢獻1784條經驗 獲得超2個贊
兩者都不能編譯。
為了使前者編譯,應該聲明一個變量,并給出該變量的名稱。
Outer.Inner?obj?=?objOut.new?Inner();
即使您執行此步驟,后者也不會編譯,因為它既objOut.Inner
不是類型(因為主表達式objOut
不是類型)也不是有效名稱(因為在標識符 (jls-3.8).
中不允許使用)。
針對您的情況的簡化規則(jls-14.4)是
LocalVariableType?VariableDeclaratorId?[=?VariableInitializer];

TA貢獻1827條經驗 獲得超4個贊
這個 :
Outer.Inner = objOut.new Inner();
不會編譯,但如果你將其更改為:
Outer.Inner object = objOut.new Inner();
將意味著創建一個引用類的內部類實例Outer
-objOut
將是Outer
類的實例。
還有這個:
objOut.Inner = objOut.new Inner();
不會編譯,因為objOut
該類的實例Outer
沒有 poperty Inner
。
并不是Outer
類知道類的實例Inner
,而是Inner
類實例知道Outer
創建它的類實例。
編輯
該行:
objOut.Inner object2= objOut.new Inner();
將無法編譯,因為Inner
類型標識符屬于Outer
類而不是此類的實例。
添加回答
舉報