Java:当 foo() 在超类中时,this.foo() 和 super.foo() 是一样的吗?

2022-09-02 12:37:11

假设我有以下类:

class Foo {
    protected void method() {}
}

class Bar extends Foo {

}

此时,从类 Bar 中,我可以通过两种方式访问:method()

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

从我所看到的,他们似乎执行相同的动作。在这种情况下,这两者之间有区别吗?如果是这样,是否有首选版本?

使用是有意义的,因为它是超类的一部分。我想使用也是有意义的,因为Bar将继承类Foo的属性,因此也是如此,对吧?supermethod()thismethod()


答案 1

是的,调用与 相同的方法。this.foo()super.foo()

请注意,如果在子类中被覆盖,则将存在差异。但在这种情况下,它运行相同的方法实现。foo()

当我们需要专门请求执行超类的方法实现时,当当前类中有一个可用时,我们使用超类。super.foo()

使用 super 是有道理的,因为 method() 是 super 类的一部分

是的,但请记住,子类可以在某个时候更改并获得被覆盖的,在这种情况下,可能会开始调用意外的实现。
这是需要注意的。因此,调用 或无限定可能是合理的。foo()super.foo()this.foo()foo()


答案 2

请注意,孩子可以再次被覆盖:

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()