第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

5 回答

?
12345678_0001

TA貢獻1802條經(jīng)驗 獲得超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.

這里的關(guān)鍵是內(nèi)部類是通過對外部類的引用創(chuàng)建的。如果您的 InnerClass 是靜態(tài)的(一個 InnerClass 代表整個 OuterClass 類),您會看到對外部類的引用是靜態(tài)的:


static class InnerClass { ... }

...

//Initialization will become:

OuterClass.InnerClass innerObject = new OuterClass.InnerClass();

                                        ^ this part is a static OuterClass reference

另一方面,在您當(dāng)前的場景中(InnerClass 不是靜態(tài)的),必須使用對象形式的對 OuterClass 的引用來創(chuàng)建內(nèi)部類 - outerObject。此外,您實際上可以outerObject通過參考從 InnerClass 內(nèi)部訪問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輸出是一個任意的內(nèi)存地址。這兩條輸出線將始終相同。OuterClass.this您可以清楚地看到,從 InnerClass 實例內(nèi)部引用將返回初始化時提供的 OuterClass 實例。這是您不能只調(diào)用的部分原因new InnerClass()——OuterClass.this如果不提供實例,則無法正確初始化引用。


查看完整回答
反對 回復(fù) 2023-06-14
?
SMILET

TA貢獻1796條經(jīng)驗 獲得超4個贊

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

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

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

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

com.example.MyLibrary.ExternalClass myExternalObject;


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

TA貢獻1820條經(jīng)驗 獲得超10個贊

OuterClassJVM 在和之間沒有區(qū)別InnerClass:這兩個類都是 POJO 和單獨的類。但InnerClass不是static,因此它有內(nèi)部this引用的實例OuterClass(因此它應(yīng)該只用現(xiàn)有實例創(chuàng)建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;

    }   

}


查看完整回答
反對 回復(fù) 2023-06-14
?
炎炎設(shè)計

TA貢獻1808條經(jīng)驗 獲得超4個贊

Outerclass.Innerclass只是內(nèi)部類完整路徑的一部分。
完整路徑類似于packagename.Outerclass.Innerclass.

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


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

TA貢獻1719條經(jīng)驗 獲得超6個贊

您可以將內(nèi)部類定義為 OuterClass 的靜態(tài)成員


public class OuterClass {

    public static class StaticInnerClass {

        int i = 0;


        public String call() {

            i++;

            return this.getClass().getName() + " i=" + i;

        }

    }

}

所以定義靜態(tài)內(nèi)部類編譯知道成員是一個類,內(nèi)存區(qū)域在編譯時實例化(它可以靜態(tài)方式訪問)并且您可以在另一個內(nèi)存區(qū)域中應(yīng)用新運算符和新運算符實例類。


例如在主類中


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。


查看完整回答
反對 回復(fù) 2023-06-14
  • 5 回答
  • 0 關(guān)注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號