2016-05-27 2 views
2

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

+4

Это * есть * переопределение! –

ответ

0

Java Language Specification использует термин «переопределение» для этого:

Если не-абстрактный метод мК переопределяет абстрактный метод м из класса С, тем мК называется осуществить мА от C.

Здесь используется слово override, включающее случай реализации абстрактного метода. Реализация описывается как специализированный случай переопределения.

0

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

Абстрактный метод не имеет тела .

+1

Но разные классы, которые реализуют этот абстрактный метод, действительно делают разные реализации каждый раз, когда они реализуются. Аргумент отсутствия тела метода не кажется мне правильным. Пожалуйста, объясните подробнее. –

+0

Это по сути то же самое. В обоих случаях вы * * переопределяете метод: не имеет значения, является ли метод абстрактным или нет. Поэтому в обоих примерах можно написать '@ Overrides'. Разница между абстрактным и не абстрактным методом объясняется в моем ответе :) – Exfridos

0

Реализация абстрактного метода не переопределяет ИМХО, хотя может использоваться аннотация @Override.

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

+0

Итак, если у меня есть класс, который расширяет абстрактный класс, а также реализует интерфейс, который реализует абстрактный класс. В интерфейсе у меня есть абстрактный метод , мой абстрактный класс реализует этот абстрактный метод, и мой конкретный класс также реализует этот метод. Тогда как это будет; конкретный класс реализует этот абстрактный метод из интерфейса или переопределяет абстрактный метод из абстрактного класса? –

0

Это переопределение.

Доказательство:

abstract public class Shape { 
    public abstract void draw(); 
} 

public class Square extends Shape { 
    @Override // this does not fail! 
    public void draw() { 
     System.out.println("I am square!"); 
    } 

    public static void main(String[] args) { 
     Shape s = new Square(); 
     s.draw(); 
    } 
} 

Если бы это не было переопределение, использование @Override должен был помечен компилятором (аннотаций процессор) как ошибка.

Смежные вопросы