Есть ли смысл называть метод super? - PullRequest
2 голосов
/ 26 января 2012

Например:

public class ClassA extends ClassB { 


public void run() {
  super.execute();
 ...................

Выполнение метода существует только в ClassB.Имеет ли смысл использовать:

super.execute();

может быть достаточно:

execute();

?Благодаря.

Ответы [ 5 ]

7 голосов
/ 26 января 2012

Поскольку метод execute() не переопределяется в ClassA, execute() эквивалентен эквивалентному до super.execute().

Я не вижу абсолютно никакой "документальной" выгоды от того факта, что метод определен в суперклассе. Таким образом, лично я написал бы execute() (если не было веских причин для вызова super.execute(), если ClassA когда-либо был изменен для переопределения execute).

4 голосов
/ 26 января 2012

Причины:

  1. Предсказуемость (безопасность?) - если однажды кто-нибудь реализует ClassA.execute(), код будет работать по-другому. Это также имеет место, даже если кто-то подклассы ClassA и переопределяет execute(), оставляя ClassA без изменений.

  2. Производительность - супер вызов может быть быстрее, чем виртуальный. super реализован с использованием invokespecial (одиночная отправка, как и метод private), в то время как обычный вызов не частного метода использует двойную диспетчеризацию (виртуальный вызов). Это слабое преимущество в современных JVM.

Итог: если ClassB.execute() равно final, использование super не имеет смысла.

3 голосов
/ 26 января 2012

Можно звонить super.

Если вы хотите убедиться, что вызываете метод родительского класса, используйте super. Поэтому, если вы введете метод позже в ClassA, код не сломается.

Наоборот, если вы хотите позвонить execute как бы то ни было ... не используйте super.

super обычно существует зарезервированное слово для вызова переопределенного метода из переопределенного.

3 голосов
/ 26 января 2012

Нет, просто позвоните execute().Поскольку метод не переопределяется , super.execute() будет иметь тот же результат, что и this.execute(), что совпадает с execute().

0 голосов
/ 26 января 2012

Согласно синтаксису Java это правильно.но когда дело доходит до реальных концепций разработки программного обеспечения, это вообще не имеет никакого смысла. Я бы предложил переопределить метод run в классе B, а затем вызвать внутри него метод суперкласса.После вызова метода класса ужин вы можете создать специальную логику для подкласса.Как будто у вас есть некоторые общие функции в родительском методе и определенные функции (в дополнение к тому, что имеет родительский) в подклассе.

...