2013-05-24 3 views
2

У меня есть интерфейс, как показано ниже.Требуется реализация методов интерфейса или нет

Я получил этот код по умолчанию в Eclipse. Confused, Почему атрибут @Override подходит?

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

public interface IRecord { 
     @Override 
     public String toString(); 

     public void showName(String name); 
    } 

И его одна реализация, как показано ниже

public class Record implements IRecord{ 

    @Override 
    public void showName(String name) { 
      //Doing something 
    } 
} 

Это получение выполнил очень хорошо, как ожидалось, но я немного удивлен, почему его не просил меня осуществить реализацию toString() метода,?

Это объект класса Object, но класс Object не реализует мой интерфейс.

+0

'Я получил этот код по умолчанию в Eclipse' - как вы создали этот код? Какую версию Eclipse вы используете? –

+0

Eclipse SDK HELIOS Версия: 3.6.1 Код сборки: M20100909-0800 – Jaikrat

+0

И как вы создали интерфейс? С помощью Eclipse Juno при выборе «New => Interface» из браузера проекта введите имя интерфейса и нажмите «Готово», все, что я получаю, - это пустое объявление интерфейса. –

ответ

6

Все классы неявно расширяют Object, который уже реализован toString(). И так как ваш класс Record реализует ваш интерфейс и наследует метод toString() от Object, контракт выполнен.

+0

Спасибо .. Я проверил это, сделав один из моих родительских классов и применив ту же логику. – Jaikrat

0

Атрибут @Override предназначен для обеспечения безопасности компилятора. Просто убедитесь, что вы действительно хотели переопределить метод и что вы этого не сделали по ошибке

0

Поскольку Object является базовым классом всех других классов и toString метод, определенный в классе объектов, он уже реализован ,

1

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

Возможно, вам интересно, почему Eclipse предоставляет вам по умолчанию переопределенный toString в вашем шаблоне интерфейса: я думаю об этом как напоминании о внедрении toString для чего-то значимого в дальнейшем.

+0

'Интерфейсы не наследуются от Object' - не в обычном смысле, но интерфейс верхнего уровня неявно объявляет все общедоступные методы из' Object' –

1

Каждый класс расширяет java.lang.Object в java, если вы не расширяете его, а затем неявно. Объект рассматривается.

Посмотрите на свой код только:

public interface IRecord { 
    @Override 
    public String toString(); 

    public void showName(String name); 
} 

Каким образом у вас есть @Override аннотацию в ToString() метод, вы должны быть inherting его где-то,

Как metioned в JLS: Если интерфейс не имеет прямых суперинтерфейсов, то интерфейс неявно объявляет открытый абстрактный метод-член m с сигнатурой s, возвращаемым типом r и предложением th, соответствующим каждому методу публичного экземпляра m с сигнатурой s, типом возврата r и предложением throws t, объявленного в Object.

Вот почему вы можете увидеть аннотацию переопределения выше метода toString().

Теперь, когда вы реализуете класс IRecord, ваш класс реализации также расширяет класс Object, который имеет метод toString(). Следовательно, его не требуется для реализации здесь.

+1

Да ... Я думаю, интерфейсы не наследуют методы от Object – Jaikrat

+0

@Jai Я был думая об этом раньше (отсюда +1 ;-)), но на самом деле интерфейсы ** do ** неявно наследуют все общедоступные методы из 'Object'. См. Мой ответ. –

+0

@ Химаншу, вы можете снова отредактировать свой пост :) – Jaikrat

2

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

От Java Language Specification:

Если интерфейс не имеет никаких прямых суперинтерфейсов, то интерфейс неявно присваивает абстрактный метод публичным м с подписью s, тип возвращаемого значения г, и бросает пункт t , соответствующий каждому способу публичного экземпляра m с сигнатурой s, типом возврата r и предложением throws t , объявленным в Object, если только метод с той же сигнатурой, такой же тип возврата и условие совместимости throws явно объявлено интерфейсом.

Другими словами, даже пустой интерфейс неявно наследует все общедоступные методы от Object. Именно по этой причине Eclipse (правильно) добавляет аннотацию @Override. Он не будет, скорее всего, никогда не удастся из-за какой-либо из методов удаления из Object, но это может быть полезно, чтобы избежать опечаток:

interface IRecord { 
    @Override 
    public String toSTring(); 
} 

Error: "The method toSTring() of type IRecord must override or implement a supertype method" 

Смотрите другие ответы на вторую часть вопроса.

+0

Извините, не смог ответить ... пришлось пойти на один звонок. Да, точно. Хорошее объяснение с Ex. Сегодня я узнал одно, что аннотации должны избегать опечаток. Раньше я удалял лишние слова (например, аннотации) :) – Jaikrat

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

  • Нет связанных вопросов^_^