Java:当foo()在超类中时,this.foo()和super.foo()是否相同?

Mag*_*ull 19 java extends this super

说我有以下课程:

class Foo {
    protected void method() {}
}

class Bar extends Foo {

}
Run Code Online (Sandbox Code Playgroud)

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

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

从我看来,他们似乎执行相同的行动.在这种情况下,这两者之间是否存在差异?是否有首选版本可供使用?

使用super是有道理的,因为它method()是超类的一部分.this我认为使用也很有道理,因为Bar将继承Foo类的属性,因此method(),对吧?

ern*_*t_k 18

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

请注意,如果foo()在子类中重写,则会有所不同.但在这种情况下,它运行相同的方法实现.

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

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

是的,但请记住,子类可以在某个时刻更改并获得重写foo(),在这种情况下super.foo()可能会开始调用意外的实现.
这是值得注意的.因此,打电话this.foo()或不合格foo()可能是合理的.


Owe*_*wen 12

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

生产:

Hi
Bye
Run Code Online (Sandbox Code Playgroud)

所以,虽然this.method()super.method()行为可能同样在某些情况下,它们不会产生相同的字节码.