5 回答

TA貢獻1802條經驗 獲得超5個贊
如果我沒記錯的話,句法含義如下:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
InnerClass The class InnerClass
. which is an inner class of
OuterClass OuterClass
innerObject has an instance named innerObject
= which is assigned the value
new InnerClass() of a new InnerClass instance
. such that when you use
OuterClass.this from within
InnerClass methods invoked on
innerObject, it refers to
outerObject outerObject.
這里的關鍵是內部類是通過對外部類的引用創建的。如果您的 InnerClass 是靜態的(一個 InnerClass 代表整個 OuterClass 類),您會看到對外部類的引用是靜態的:
static class InnerClass { ... }
...
//Initialization will become:
OuterClass.InnerClass innerObject = new OuterClass.InnerClass();
^ this part is a static OuterClass reference
另一方面,在您當前的場景中(InnerClass 不是靜態的),必須使用對象形式的對 OuterClass 的引用來創建內部類 - outerObject。此外,您實際上可以outerObject通過參考從 InnerClass 內部訪問OuterClass.this:
OuterClass.java
public class OuterClass
{
class InnerClass
{
public OuterClass getOuterClassReference()
{
return OuterClass.this;
}
}
}
Main.java
class Main
{
public static void main(String[] args)
{
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
System.out.println(outerObject);
System.out.println(innerObject.getOuterClassReference());
System.out.println(outerObject == innerObject.getOuterClassReference());
}
}
輸出:
OuterClass@36baf30c
OuterClass@36baf30c
真
這里,36baf30c輸出是一個任意的內存地址。這兩條輸出線將始終相同。OuterClass.this您可以清楚地看到,從 InnerClass 實例內部引用將返回初始化時提供的 OuterClass 實例。這是您不能只調用的部分原因new InnerClass()——OuterClass.this如果不提供實例,則無法正確初始化引用。

TA貢獻1796條經驗 獲得超4個贊
這是類的名稱,很可能這樣命名是為了讓編譯器更容易找到定義。
如果您將變量聲明為 type InnerClass
,它將查找 file InnerClass.java
,但沒有這樣的文件。
點符號表示它實際上是 的成員OuterClass
,因此它將在文件中查找定義OuterClass.java
。
這與使用庫中的類是一樣的,
com.example.MyLibrary.ExternalClass myExternalObject;

TA貢獻1820條經驗 獲得超10個贊
OuterClassJVM 在和之間沒有區別InnerClass:這兩個類都是 POJO 和單獨的類。但InnerClass不是static,因此它有內部this引用的實例OuterClass(因此它應該只用現有實例創建OuterClass)
public class OuterClass {
public class InnerClass {
public OuterClass getOuterClassReference() {
return OuterClass.this;
}
}
}
OuterClass outerObject = new OuterClass();
OuterClass.InnterClass innerObject = outerObject.new InnerClass(); // innerObject has this reference to outerObject
public class OuterClass {
public static class InnerClass {}
}
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = new OuterClass.InnerClass(); // innerObject does not have this reference to outerObject
換句話說,你可以InnterClass像這樣自己模擬:
public class OuterClass {
}
public class InnerClass {
private final OuterClass outer;
public InnerClass(OuterClass outer) {
this.outer = outer;
}
}

TA貢獻1808條經驗 獲得超4個贊
Outerclass.Innerclass
只是內部類完整路徑的一部分。
完整路徑類似于packagename.Outerclass.Innerclass
.
因此, OuterClass.InnerClass innerObject = outerObject.new InnerClass();
實際上與以下內容沒有什么不同:java.util.ArrayList<T> varName = new java.util.ArrayList<T>();

TA貢獻1719條經驗 獲得超6個贊
您可以將內部類定義為 OuterClass 的靜態成員
public class OuterClass {
public static class StaticInnerClass {
int i = 0;
public String call() {
i++;
return this.getClass().getName() + " i=" + i;
}
}
}
所以定義靜態內部類編譯知道成員是一個類,內存區域在編譯時實例化(它可以靜態方式訪問)并且您可以在另一個內存區域中應用新運算符和新運算符實例類。
例如在主類中
public class Main {
public static void main(String[] args) {
/**
* https://stackoverflow.com/questions/57581397/how-instantiating-an-inner-class-in-java-really-works
*
* @@@ New instance of Inner class
*/
OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
System.out.println(staticInnerClass.call());
System.out.println(staticInnerClass.call());
staticInnerClass = new OuterClass.StaticInnerClass();
System.out.println("\n" + staticInnerClass.call());
System.out.println(staticInnerClass.call());
}
}
帶輸出
// new of inner class and i = 0
innerclass.OuterClass$StaticInnerClass i=1
innerclass.OuterClass$StaticInnerClass i=2
// new of inner class and i = 0
innerclass.OuterClass$StaticInnerClass i=1
innerclass.OuterClass$StaticInnerClass i=2
參考資料: https: //docs.oracle.com/javase/tutorial/java/javaOO/nested.html。
添加回答
舉報