Java - расширение класса и повторное использование методов?

public class BaseClass {
   public void start() {
      // do something
   }
}

public class ClassA extends BaseClass {

}

ClassA c = new ClassA();
c.start();

В следующем коде я хочу использовать метод start(), как он был определен в суперклассе, я видел во многих других кодеках разработчиков, что они переопределяют метод в суперклассе, а затем они называют супер, есть ли причина для этого?

public class ClassA extends BaseClass {
   @Override
   public void start() {
      super.start();
   }
}

Ответ 1

Ясность? Некоторые разработчики считают, что яснее показать метод в подклассе. Я не согласен. Это избыточная информация.

По крайней мере, начиная с Java 5, вы можете добавить @Override, чтобы компилятор сообщил вам, изменяется ли подпись/исчезает.

За исключением конструкторов. Для конструкторов вам действительно нужно создавать свои собственные с той же подписью и делегировать вверх. В этом случае опускание не эквивалентно.

Ответ 2

Переопределяя метод, делая что-то особенное, вызов super.method() называется украшением метода - вы добавляете к поведению. Подробнее здесь: Рисунок декоратора.

Переопределение без вызова метода super просто переопределяет метод - изменение поведения.

Ответ 3

public class ClassA extends BaseClass {
  @Override
  public void start() {
     super.start();
  }
}

делает то же самое, что и вообще не переопределяет

public class ClassA extends BaseClass {}

Итак, если у вас нет дополнительных функций для добавления (в этом случае вы вызываете метод суперкласса, а затем добавляете дополнительную логику) или делать что-то другое (вы не называете метод суперкласса и просто определяете какую-то другую логику) вам лучше не переопределять метод суперкласса (и вызвать метод суперкласса), потому что это бессмысленно.

Ответ 4

Я иногда делаю это (временно, во время разработки), когда я хочу установить там точку останова.

Ответ 5

Основной причиной концепции наследования является обобщение функций или операций, которые являются общими для подклассов. Имеет смысл переопределить только тогда, когда нам нужно настроить операцию для конкретного подкласса.

  • Но в одном месте, где нам нужно сделать переопределение, скажем, вы перегрузили свой конструктор по умолчанию суперкласса, а затем в подклассе вам нужно упомянуть о вызове перегруженного суперклассического конструктора в качестве первой строки в вашем подклассе конструктор (т.е. объект суперкласса должен быть создан до создания подкласса). Например

класс BaseClass {

BaseClass (арг1) {

}

}

класс A расширяет BaseClass {

а {     супер (arg1);    }

}

В других местах это только добавило бы избыточность кода, который вовсе не нужен