Java: это.foo() и супер.foo () то же самое, когда foo() находится в супер классе?

скажем, у меня есть следующие классы:

class Foo {
    protected void method() {}
}

class Bar extends Foo {

}

на данный момент, из панели классов, у меня есть доступ к method() двумя способами:

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

из того, что я вижу, они, кажется, выполняют одно и то же действие. Есть ли разница между этими двумя в данном контексте? Есть ли предпочтительная версия для использования, если да?

используя super имеет смысл, потому что method() является частью суперкласса. Используя this имеет смысл тоже я полагаю, так как Bar унаследует свойства класса Foo, и поэтому method() Как хорошо, да?

2 ответов


да this.foo() вызывает тот же метод, как super.foo().

обратите внимание, что будет разница, если foo() переопределяется в дочернем классе. Но в этом случае выполняется та же реализация метода.

мы используем:super.foo() когда нам нужно конкретно запросить выполнение реализации метода суперкласса, когда есть один доступный в текущем классе.

использование super имеет смысл, потому что метод () является частью super класс!--9-->

да, но помните, что дочерний класс может изменить в какой-то момент и получить переопределенную foo() в этом случае super.foo() может начать вызывать непреднамеренную реализацию.
это то, что нужно знать. По этой причине звоню this.foo(), или неквалифицированный foo() может быть оправдано.


просто имейте в виду, что ребенок может быть переопределен еще раз:

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() может вести себя одинаково в некоторых случаях, они не производят один и тот же байт-код.