2017-12-01 7 views
0

私は(メソッドと変数を簡潔にするために省略されます)、次のコードをコンパイルしている:javacが追加のクラスを作成するのはなぜですか?

// Outer.java 
public class Outer 
{ 
    private class Inner 
    { 
    } 
    void someMethod() 
    { 
     Inner inObj = this.new Inner(); 
    } 
    public static void main(String s[]) 
    { 
     Outer outerObj = new Outer(); 
    } 
} 

私が作成したクラスを列挙されたとき、それは次のように表示される:

Outer$1.class 
Outer$Inner.class 
Outer.class 

外$ Innerが論理的に見えます。 の目的は何ですか?外部$ 1クラスですか?これらを時間スケールで作成する順序は何ですか?

+1

「これらを時間スケールで作成する順序は何ですか?」なぜそれを知ることが重要だと思いますか? –

+0

なぜですか?クラスを作成するjavacのメカニズムを理解することです。 –

+0

オーダーは「1」と思われます。 Outer.class 2. Outer $ Inner.class 3. Outer $ 1.class'、Windowsの 'date modified'列でソートされたとき。 – 11thdimension

答えて

1

好奇心。私はこれが何であるか分かりません。しかし、あなたはクラスをコンパイルすると、あなたはそれがどのように使われるか見ることができます: - いなくてもデフォルトのコンストラクタだから、

public class Outer { 
    public Outer(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    void someMethod(); 
    Code: 
     0: new   #2     // class Outer$Inner 
     3: dup 
     4: aload_0 
     5: aconst_null 
     6: invokespecial #3     // Method Outer$Inner."<init>":(LOuter;LOuter$1;)V 
     9: astore_1 
     10: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: new   #4     // class Outer 
     3: dup 
     4: invokespecial #5     // Method "<init>":()V 
     7: astore_1 
     8: return 
} 

class Outer$Inner { 
    final Outer this$0; 

    Outer$Inner(Outer, Outer$1); 
    Code: 
     0: aload_0 
     1: aload_1 
     2: invokespecial #1     // Method "<init>":(LOuter;)V 
     5: return 
} 

class Outer$1 { 
} 

を、​​3210は何が含まれていないようです。しかし、​​3210への参照は、それを構築するためにOuter$Innerに渡されなければならない。不思議なことに、someMethodに渡された値はnull(行5はsomeMethod)です。

関連する問題