2014-12-01 7 views
-1

В Java documentaion говорится:Может ли интерфейс быть суперклассом?

@Override аннотаций информирует компилятор, что элемент предназначается, чтобы переопределить элемент, объявленный в суперкласса.

У меня есть класс, который реализует в интерфейс и реализованные ППР имеют @Override аннотацию.
Означает ли это (согласно документам), что интерфейс является суперклассом моего класса? Но как это может быть, учитывая, что интерфейсы содержат только «пустые» методы, а не методы, которые на самом деле делают вещи?

Мой код LibGDX связанные:

public class MouseAndKeyboard implements ApplicationListener { 
    private Texture plane1; 
    private Sprite mainPlane; 
    private SpriteBatch mainSpritePacket; 

    @Override 
    public void create() { 
     float w = Gdx.graphics.getWidth(); 
     float h = Gdx.graphics.getHeight(); 

     ... 
+0

Интерфейс может быть расширен только интерфейсом, но может быть реализован либо абстрактным классом, либо классом Concrete –

+0

, связанным: [Как реализованы внутренние интерфейсы Java? (vtables?)] (http://stackoverflow.com/questions/4423968/how-are-java-interfaces-implemented-internally-vtables) – NiziL

+0

Интерфейсы были созданы таким образом, чтобы «наследование» было возможно (с большими ограничениями) , Таким образом, в основном это можно было бы считать Суперклассом. Вы также должны смотреть на него с другой стороны: абстрактный суперкласс также может иметь абстрактный метод без какого-либо метода! – ITroubs

ответ

3

Для таких вопросов лучше всего проверить Javadoc. И в Javadoc упоминается «супертип», а не «суперкласс»: https://docs.oracle.com/javase/8/docs/api/java/lang/Override.html

+0

Справа! Хорошее место. Я не знаю, какое теперь определение супертипа :( – jdurston

+0

Либо расширенный класс, либо реализованный интерфейс. – Gimby

+0

@Gimby Я не знаю определенной спецификации, но, например, расширенный интерфейс также является супертипом (например, https: //docs.oracle.com/javase/8/docs/api/java/io/Closeable.html) – Puce

0

в объяснений документации немного неаккуратно. Интерфейс не является суперклассом, потому что класс может иметь только один суперкласс, но реализовать несколько интерфейсов. Но вы должны использовать аннотацию @Override для методов интерфейса, чтобы показать, что этот метод наследуется (нет никакой другой Annonation для методов интерфейса).

+0

Глядя на это с чисто перспективы OO, интерфейс - это поддельная версия множественного наследования – ITroubs

1

@Override всегда беспокоил меня, потому что он используется как для переопределения фактического метода суперкласса, так и для реализации интерфейса. Таким образом, документация в части taht написана не наилучшим образом.

учитывая, что интерфейсы содержат только «пустые» методы

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

+2

Он не «всегда» был таким, '@ Override' был первоначально представлен на Java 5 с семантикой, строго применяющей для переопределения. В Java 7 это было расширено для реализаций, потому что таким образом аннотация стала намного более полезной. К сожалению, ее вводящее в заблуждение имя остается у нас. –

+0

Ассемблирующие интерфейсы используются для предоставления средств многонаследования на Java, а затем @Override не вводит в заблуждение вообще – ITroubs

+0

@ITroubs Здравый смысл и спецификация языка Java согласны с тем, что «переопределение» не применяется к реализации методов интерфейса. Здравый смысл и JLS расходятся, ho wever, когда речь идет о абстрактных методах, определенных классом: они «переопределены» применительно к JLS. –