3

非静的なネストされたクラスがある場合、囲んでいるクラスのメソッドまたは変数を呼び出すためにキーワード「this」を使用する必要があるのはなぜですか? 私は次のように考えています: 非静的なネストされたクラスがその囲んでいるクラスのメソッドと変数にアクセスでき、非静的なネストされたオブジェクト インスタンスがその囲んでいるオブジェクト インスタンスに既に関連付けられている場合、なぜ「これ」を使用する必要があるのでしょうか? たとえば、次のコードがあります。

public class ClassA {

    public class ClassB {

        public void bye() {
            ClassA.this.hello();
            // Why not just ClassA.hello()?
        }
    }

    public void hello() {

    }
}

囲んでいるクラスのメソッドから非静的クラスのメソッドを呼び出したい場合、どうすればよいですか?たとえば、メソッド hello() から bye() を呼び出したい場合、どのように入力すればよいですか?

4

3 に答える 3

6

まず、単純に を呼び出すことができますhello()

ClassA.hello()hello()ClassA で名前が付けられた静的メソッドを探します。ClassA.this.hello()インスタンスメソッドを探します。

于 2013-06-08T21:41:53.730 に答える
1

内部クラスと外部クラスの両方に同じシグネチャを持つメソッドがある場合を考えてみましょう。どちらを呼び出すかを区別できる必要があります。

 public class ClassA {

    public class ClassB {

        public void hello(){
          System.out.println("Hello b!);
        }
    }

    public void hello() {
       System.out.println("Hello a!);
    }
 }

classB からhello()を呼び出すとどうなるでしょうか? Hello b! が表示されます。

classB からthis.hello()を呼び出すとどうなりますか? Hello b! が表示されます。

これら 2 つは等価です。

classB からClassA.hello()を呼び出すのはどうですか? 例外が発生します。hello() という静的メソッドが宣言されていません。

しかし、 classB からClassA.this.hello()を呼び出したら? Hello a! を取得します。これは、内側のクラスから外側のクラスへの参照を取得するための構文です。どちらも同じシグネチャを持つメソッドを持っている必要があります。そうでない場合、内側のクラスは既に外側のクラスのメソッドにアクセスできるため、この構文を使用するのは冗長です。

于 2013-06-08T21:43:17.533 に答える
1

ClassA.hello()hello()として宣言されていれば機能しstaticます。ただし、これはインスタンスメソッドであるため、インスタンスで呼び出す必要があります。

このClassA.this構文はJLS 15.8.4で修飾thisされたものと呼ばれ、外側の型のインスタンスを参照する唯一の方法です。this

于 2013-06-08T21:47:03.350 に答える