2016-05-31 2 views
0

私はJava 8の証明書の一部を見直し、以下に示すようなコードに遭遇しました。誰かが、 'this'キーワードを使用して内部クラスをインスタンス化する際と 'this'キーワードを使用しない場合の違いを説明できますか? InnerClassのインスタンス化の両方の方法が動作するように見えます(コンパイラエラーまたは実行時エラーなし)。"this.new InnerClass()"と "new InnerClass()"のインスタンス化の相違

これは、インスタンス名ではなくpublic staticメンバーにアクセスするためにクラス名を使用する場合と似ていますか?どちらの方法も機能しますが、インスタンス名を使用する場合よりもクラス名を使用することが望まれます。

public class OuterClass { 

    class InnerClass { }        // Define Inner class 

    private InnerClass innerclass;      // private member 
    private InnerClass thisInnerClass;     // private member 

    public OuterClass() { 
     this.innerclass = new InnerClass();    // without 'this' keyword 
     this.thisInnerClass = this.new InnerClass(); // with 'this' keyword 
    } 
} 

=====================================

編集: 2つの間に違いはありません。 次の両方のバージョンをコンパイルし、md5の合計は両方のバージョンで同じです。 'this'参照を使用し、 'this'参照を使用しないと、同じバイトコードが生成されます。

public class OuterClass { 

      class InnerClass { }       // Define Inner class 

      private InnerClass innerClass;     // private member 

      public OuterClass() { 
        this.innerClass = new InnerClass();  // without 'this' keyword 
      } 
    } 

MD5合計コード上にコンパイル(無し'この' 参照)のために:
MD5(OuterClass $ InnerClass.class)= 7f1679f1c7a0201164ce5eb03fe29699
MD5(OuterClass.class)= bf7419b01f8f7c24d2892d10c4fd6e05

public class OuterClass { 

      class InnerClass { }       // Define Inner class 

      private InnerClass innerClass;     // private member 

      public OuterClass() { 
        this.innerClass = this.new InnerClass();// with 'this' keyword 
      } 
    } 

MD5上記のコンパイル済みコードの合計( 'this'参照):
MD5(OuterClass $ InnerClass .classファイル)= 7f1679f1c7a0201164ce5eb03fe29699
MD5(OuterClass.class)= bf7419b01f8f7c24d2892d10c4fd6e05

答えて

2

私の理解では、2つの間に違いはありませんということです。 foo()またはthis.foo()foo()の中のthisに含めるのは、明示的に書かれていない場合に暗示されます。

+0

私はこれも同様だと思いますが、より多くの意見を聞きたいと思います。 – Ali

+0

@Aliおそらく 'this'は、あなたの内部クラスが外部クラスと名前を共有している場合、あなたが参照しているクラスを指定するために使用できますか?それは誰もがそうであるはずの状況ではありません。 –

関連する問題