2017-01-15 20 views
0

内部クラスは、Outer_class_object.new inner_class()を使用して外部クラスの外部でインスタンス化できます。しかし、問題はOuterクラスのオブジェクトに何が起こるのでしょうか?それを参照する参照変数がないことを意味します。内部クラスが外部クラスをフィードしているので、内部クラスオブジェクトがヒープになるまでは明らかにヒープ上にあります。どのようなメカニズムjavaがそのような状況で使用するか? 次のコードを参照してください...
内部クラスのオブジェクトの作成に使用したNormalInnerClassDemoのメインの外部クラスオブジェクトはどうなりますか?それは '内部'が生きているまで生き続ける必要があります。参照変数はガベージコレクションに適格ではないという意味ではありませんか? Javaがどうやってガベージコレクタにそうしないように指示しているのでしょうか?
外部クラスオブジェクトが外部クラスの外部に作成された場合の外部クラスオブジェクトの参照

class Outer { 

    private String string = "Google"; 

    class Inner { 

     public Inner() { 
      System.out.println("From Inner:" + string); 
     } 
    } 

    public void test() { 
     //Some code here 
    } 
} 

public class NormalInnerClassDemo { 

    public static void main(String[] args) { 
     Outer.Inner inner = new Outer().new Inner(); 
    } 
} 
+0

質問が不明です。外部クラスのオブジェクトを作成し、必要に応じてインスタンス化することもできます。あなたの実際の問題は何ですか? –

+0

NormalInnerClassDemoのmainメソッドでは、Outerクラスのオブジェクト(その場で作成されたオブジェクト)を使用して内部クラスのオブジェクトを作成していますが、このオブジェクトには参照変数はありません。しかし、アウナーはインナーが生きるまで生き続ける必要があります。だから、JavaはGCに「外のオブジェクトを削除しないでください」と言っているのは、私がまだ使っている別のオブジェクト 'Inner'があるからです。 。 – omjego

+1

@omjego内部クラスのインスタンスは、外部クラスへの非表示の参照を持ちますが、最初の文とは何の関係もありません。 – EJP

答えて

1

Outer_class.inner_classを使用して、内部クラスを外部クラスの外部でインスタンス化することができます。

いいえできません。それらが作成され介し:outerは、例えばnew Outer(...)ため、Outerのインスタンスへの参照に評価される一次式である

outer.new Outer.Inner(...) 

または

this.new Inner(...) 

あなたがOuter内にあるかどうか、または短い

new Inner(...) 

ためのあなたがOuter内にあるかどうか。

しかし、外部クラスオブジェクトはどうなるのでしょうか?それを参照する参照変数がないことを意味します。

あああります:上記を参照してください。

明らかに、インナークラスが外部クラスをフィードするため、インナークラスオブジェクトがヒープになるまでヒープになります。どのようなメカニズムjavaがそのような状況で使用するか?

あなたの質問は誤って設立されました。

-1

VMがあなたのためにクリーンアップするときに、ヒープメモリを心配している理由は第一に、これはとてもJavaのでしょうか? 8)

、あなたがこれを理解するのに役立つ外部クラス(デフォルトコンストラクタ)に以下を追加するには:

Outer() { 
    System.out.println("Outer()"); 
} 

その後、プログラムを実行して、あなたは外があまりにも作成される表示されます。あなたがどのように作成されたかに関心があり、うれしいです。

+1

「内部」を作成するときに「外側」は作成されません。それは既に存在していなければなりません。さもなければ、内部クラスを作成する方法がありません。 – EJP

+0

同じことを言っています。アウトナーは、インナーを作成する前または作成時に存在する必要があります。新しいOuter()を使用してそれらを一緒に作成します。新しいInner()を作成しますが、このステートメントではOut **を作成します。 OuterはInnerのインスタンスオブジェクトを含んでいると考えてください。したがって、_inner_変数はオブジェクト全体を参照します。そのため、 'testInner(){test();という関数を定義すると、 } 'を呼び出し、' inner-> testInner();で呼び出すと 'うまく動作します。 _inner_変数は実際にはOuterで完全なオブジェクトを参照します。 – ChuckB

関連する問題