私は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
私はこれも同様だと思いますが、より多くの意見を聞きたいと思います。 – Ali
@Aliおそらく 'this'は、あなたの内部クラスが外部クラスと名前を共有している場合、あなたが参照しているクラスを指定するために使用できますか?それは誰もがそうであるはずの状況ではありません。 –