5

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

+0

это не переопределить.В интерфейсе вы объявляете подпись метода, а не реализации. Переопределение - это когда у вас более одного метода, интерфейс - это реализация сигнатуры, объявленной в интерфейсе. В java 5 переопределение реализации интерфейса привело к ошибке компиляции. Поскольку java 6 это не ошибка. – lateralus

+0

Кажется, что он лучше подходит для сайта [программистов] (http://programmers.stackexchange.com), поскольку он более концептуальен, чем практический. – GoBusto

+1

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8 – Rouby

ответ

5

Термин «переопределение» применяется, когда существует существующая реализация метода. Правильный термин - «реализация» для интерфейсов и других абстрактных деклараций.

@Override тег используется для обоих случаев - она ​​используется, когда:

Метод имеет приоритет или реализуют метод, объявленный в надтипа. - javadocs

И от Wikipedia:

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

Обратите внимание, что интерфейсы могут иметь default methods - переопределение этих методов переопределяет им:

При расширении интерфейс, который содержит метод по умолчанию, вы можете ... переопределить метод по умолчанию, который переопределяет Это.

Помимо ссылки на «канонические» источники, я не уверен, какой совет предложить выиграть семантический аргумент с вашим другом. Возможно, вы могли бы спросить его, что такое различие между «внедрением» и «переопределением», и какое слово он использовал бы вместо «переопределения» для концепции переопределения существующего метода.

+0

+1 для методов по умолчанию в интерфейсах. Я не думаю, что когда-нибудь захочу их использовать, но я не знал о них. – Joeblade

+0

Я согласен с тем, что они неудобны, но вы не можете добавлять новые объявления к открытым интерфейсам без них. –

3

На первый взгляд интерфейсы просто определяют API. Поскольку супер-метод не переопределяется, реализация является первым методом.

Но так как Java 5 обычно добавляет аннотации @Override даже для методов, которые поступают из интерфейсов. Основная причина здесь - поймать проблемы, которые происходят, когда люди меняют интерфейс: теперь у вас есть метод, который «болтается» - нет API, который говорит, что метод должен быть там. Аннотирование вызывает ошибку, если вы удалите метод из интерфейса, поймав его, чтобы вы могли правильно очистить весь код.

Но это все еще не означает, что метод реализации переопределяет что-либо.

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

Мое ощущение, что вы можете спорить в обоих направлениях, но аргумент спорный, если у вас нет варианта использования, ответ на вопрос фактически оказывает реальное влияние на код. И здесь это не имеет большого значения, поскольку компилятор скрывает все уродливые детали.