亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Java 中實例化一個內部類是如何真正起作用的?

在 Java 中實例化一個內部類是如何真正起作用的?

侃侃無極 2023-06-14 16:40:36
我正在從內部類創建一個實例,但我不明白這種語法是什么意思。OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass();我知道如果不從外部類中獲取對象就無法從內部類中獲取對象,然后我們使用外部類outerObjectOuterClass outerObject = new OuterClass();中的對象從內部類中獲取實例,那么OuterClass.InnerClass到底是什么意思因為它在 Java 文檔中沒有解釋,因為它指出:outerObject.new InnerClass();要實例化內部類,必須先實例化外部類。然后,使用此語法在外部對象中創建內部對象 OuterClass.InnerClass innerObject = outerObject.new InnerClass();
查看完整描述

5 回答

?
12345678_0001

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如果不提供實例,則無法正確初始化引用。


查看完整回答
反對 回復 2023-06-14
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

這是類的名稱,很可能這樣命名是為了讓編譯器更容易找到定義。

如果您將變量聲明為 type InnerClass,它將查找 file InnerClass.java,但沒有這樣的文件。

點符號表示它實際上是 的成員OuterClass,因此它將在文件中查找定義OuterClass.java

這與使用庫中的類是一樣的,

com.example.MyLibrary.ExternalClass myExternalObject;


查看完整回答
反對 回復 2023-06-14
?
拉莫斯之舞

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;

    }   

}


查看完整回答
反對 回復 2023-06-14
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

Outerclass.Innerclass只是內部類完整路徑的一部分。
完整路徑類似于packagename.Outerclass.Innerclass.

因此, OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 實際上與以下內容沒有什么不同:
java.util.ArrayList<T> varName = new java.util.ArrayList<T>();


查看完整回答
反對 回復 2023-06-14
?
慕俠2389804

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。


查看完整回答
反對 回復 2023-06-14
  • 5 回答
  • 0 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號