2015-08-24 2 views
1

У меня есть вопрос относительно интерфейсов.Разница между самоподготовленными интерфейсами и готовыми интерфейсами

Например, когда я создаю интерфейс, и этот интерфейс имеет три разных абстрактных метода. Класс, который реализует этот интерфейс, должен иметь эти методы в классе, чтобы написать тело для них. Однако, когда я реализую готовый интерфейс, мне не нужно писать тело для методов, которые имеет этот конкретный интерфейс. Например, если я реализую «клонируемый» интерфейс в своем классе, мне не нужно писать тело для метода «clone», которое определено в клонированном интерфейсе. Почему это так?

Спасибо за ваше время и интерес.

+0

Нет, я не продлеваю. –

+0

Для записи 'Cloneable' не определяет никаких методов. 'clone' является защищенным методом в' Object', поэтому, поскольку он не абстрактный, ваш класс не обязан переопределять его. – TNT

ответ

3

интерфейсы без методов называются интерфейсами "маркер" в Java. Интерфейсы Serializable и Cloneable являются примерами таких интерфейсов.

Цитируя Wikipedia page on marker interfaces:

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

Closeable с другой стороны, не такой интерфейс: он определяет close() метод, который необходимо реализовать.

+0

На самом деле, я выбрал свой пример неправильно. Я сделал это с «клонируемым» интерфейсом и не должен был писать какое-либо тело для методов, которые «клонировали», и думал, что я узнал интерфейсы false. Я редактирую свой пример в вопросе. Спасибо за ответ. Я буду исследовать эти «маркерные» интерфейсы. –

1

Если вы используете интерфейс Closeable напрямую, вам необходимо реализовать close().

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

Из документации Oracle по:

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

Ссылка здесь: https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

+1

Даже если вы реализуете его напрямую (т. Е. Ваш класс содержит «реализует Closeable»), вам все равно не нужно указывать определение 'close()', если суперкласс уже делает. – yshavit

+0

Я понимаю, что я неправильно понял вопрос, который использует «Cloneable» в качестве примера, а не «Closeable». Виноват! – btidwell

+0

Ха! Я тоже. Хороший улов. – yshavit

1

Возможно, пример объяснит это лучше, см. Ниже.

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

interface A{ 
    void method1(); 
    void method2(); 
} 

abstract class B1 implements A { 
    // B1 must be declared abstract as it does not provide implementation of method2 
    @Override public void method1() {} 
} 

class B2 extends B1{ 
    @Override public void method2() {} 
} 

class B3 extends B2{ 
    static void bar(){ 
     B1 b1 = new B1(); // ERROR B1 is abstract 
     B1 b2 = new B2(); // OK, all methods of A are implemented 
     B1 b3 = new B3(); // as above 
    } 
} 
+0

Большое спасибо. Это отличный пример. Этот пример также отвечает на мой вопрос, но этот «маркерный» интерфейс был для меня непонятным. –

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