Java: являются ли this.foo () и super.foo () одинаковыми, когда foo () находится в суперклассе? - PullRequest
0 голосов
/ 02 июня 2018

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

class Foo {
    protected void method() {}
}

class Bar extends Foo {

}

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

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

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

0 голосов
/ 02 июня 2018

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

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

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

Использование super имеет смысл, поскольку method () является частью суперкласса

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

...