web-dev-qa-db-ja.com

Java:foo()がスーパークラスにある場合、this.foo()とsuper.foo()は同じですか?

次のクラスがあるとします。

_class Foo {
    protected void method() {}
}

class Bar extends Foo {

}
_

この時点で、クラスBarから、次の2つの方法でmethod()にアクセスできます。

  • super.method();
  • this.method();

私が見るところ、彼らは同じ行動をしているようです。この文脈でこれら2つの間に違いはありますか?もしそうなら、使用するのに好ましいバージョンはありますか?

method()はスーパークラスの一部であるため、superを使用することは理にかなっています。 BarはFooクラスのプロパティを継承するため、thisを使用することも理にかなっていると思います。したがって、method()も同様ですよね?

19
Magnus Bull

はい、this.foo()super.foo()と同じメソッドを呼び出します。

子クラスでfoo()をオーバーライドすると、違いが生じることに注意してください。ただし、この場合、同じメソッド実装を実行します。

現在のクラスで使用可能なものがある場合、スーパークラスのメソッド実装の実行を具体的に要求する必要がある場合は、super.foo()を使用します。

Method()はスーパークラスの一部であるため、スーパーを使用することは理にかなっています

はい。ただし、子クラスはある時点で変更され、オーバーライドされたfoo()を取得する可能性があることに注意してください。その場合、super.foo()は意図しない実装の呼び出しを開始する可能性があります。
これは注意すべき点です。このため、this.foo()または修飾されていないfoo()を呼び出すことは正当化される場合があります。

18
ernest_k

子が再びオーバーライドされる可能性があることに注意してください。

_public class Main {
  static class Foo {
    protected void method() {
      System.out.println("Bye");
    }
  }

  static class Bar extends Foo {
    {
      this.method();
      super.method();
    }
  }

  static class Baz extends Bar {
    protected void method() {
      System.out.println("Hi");
    }
  }

  public static void main(String[] args) {
    new Baz();
  }
}
_

生産:

_Hi
Bye
_

したがって、this.method()super.method()は同じように動作する場合がありますが、同じバイトコードを生成しません。

12
Owen