2012-05-14 3 views
0

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

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

Что делать, если по какой-то причине Java Guys в одной из своих новых версий решают преодолеть это ограничение и позволить наследовать от нескольких классов, то какая разница между абстрактными классами и интерфейсами? Будут ли они просто синонимами? У интерфейсов все еще есть причина для существования или просто будет избыточным?

+0

Вы имеете в виду, если классы, где разрешено наследовать несколько * полностью * абстрактных классов? (т. е. классы с * только * абстрактными методами) – aioobe

+0

m боятся его слишком поздно для java-парней, чтобы сделать это, поскольку много кода уже написано со старыми правилами, и его изменение вызовет много проблем совместимости ... – WickeD

+0

You не может обсуждать концепцию абстрактного класса и интерфейса здесь. Вы можете задавать только программные проблемы. И добавив к этому, вы не можете сказать, что чистый абстрактный класс аналогичен интерфейсу. например. Можете ли вы наследовать несколько классов в абстрактном классе? Нет. Для этого вам необходимо иметь интерфейсы. –

ответ

3

Класс является «абстрактным», если он имеет хотя бы один абстрактный метод; другие методы могут быть реализованы в абстрактном классе. Интерфейсы не могут этого сделать; они чисто аннотация.

public interface Iface { 
    void foo() { 
     System.out.println("Foo"); 
    } 
} 
$ javac Iface.java 
Iface.java:2: interface methods cannot have body 
    void foo() { 
      ^
1 error

Но если вы говорите о полностью абстрактного класса   — где все методы являются абстрактными   — тогда, если вы постулировать множественное наследование Я не сразу видя никаких реальных сохраняющихся разногласий , no.


Re ваш комментарий на ваш вопрос выше:

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

Если у Java было многократное наследование с 1-го дня, вполне возможно, нет, поскольку абстрактные классы выполнили бы эту работу.

+1

Но, я могу иметь чистый абстрактный класс со всеми абстрактными методами, которые очень хорошо себя чувствуют, как интерфейс, то почему у вас вообще есть интерфейсы? – Drona

+0

@VikasNalwar: Существует принципиальная разница, но что более важно для Java, поскольку это действительно (одно наследование), наличие интерфейса позволяет нам иметь множественное наследование «lite», реализуя несколько интерфейсов. –

+1

Если 'Interface1', который имеет свойство' Foo', наследуется интерфейсами 'Derived1' и' Derived2', оба из которых наследуются 'Subderived1', тогда' Subderived1' будет иметь только один метод 'Foo', который может override, который будет использоваться всеми четырьмя интерфейсами. С абстрактными классами вещи могут быть более мрачными. – supercat

2

Будут ли они просто синонимами? У интерфейсов все еще есть причина для существования или просто будет избыточным?

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

Класс с абстрактными методами - это точно так же, как интерфейс, так что да, в некотором смысле интерфейсы будут просто синтаксическим сахаром, я думаю.

В коде

interface Foo { 
    void method(); 
} 

class MyClass extends MyBaseClass implements Foo { 
    public void method() { ... } 
} 

бы гипотетически быть эквивалентно

abstract class Foo { 
    public abstract void method(); 
} 

class MyClass extends MyBaseClass, Foo { 
    public void method() { ... } 
} 

Связанные вопрос (почти дублировать!):

+0

Я, кажется, совершенно согласен с вашими логическими рассуждениями. Таким образом, нам вообще не нужны интерфейсы. – Drona

+0

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

+0

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

0

Тем не менее, я думаю, что есть difference.Interface представляет собой контракт, только реализация которой принадлежит вам, даже если ограничение множественного наследования removed.In Java, вы можете выводить множественное поведение наследования с помощью интерфейсов, но это может не принести все функции реального множественного наследования (например, вызов его суперклассов и т. д.). Это своего рода техника.

Относящийся класс является объектом частичного объекта, также может содержать полные реализации. Так что даже если можно расширить несколько классов, то, что вы делаете с интерфейсом, отличается. Я считаю, что множественное наследование и абстрактный класс и интерфейсы различны в Java.

+0

Но разве вы не думаете, что мы могли бы заключить контракт посредством чистых классов, а не интерфейсов? – Drona

+0

В этом случае в терминах терминологии java мы не будем называть это контрактом, мы «перегружаемся» или меняем существующее поведение. Разве это не так? – UVM

+0

Но у нас не было бы никакой реализации поведения в чистом абстрактном классе, так же как и в случае с интерфейсами сегодня. Таким образом, мы ничего не будем преувеличивать. Так же, как в C++; мы можем заключить контракт через чистые абстрактные классы. – Drona

0

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

Это образец, который заставляет нас соблюдать контракт без разрешения бриллиантов.

Так что, если вы сделаете компилятор, который может проверить абстрактные классы для не имеющих каких-либо реализаций на нем, вы могли бы заменить все интерфейсы с абстрактными классами (которые соблюдают этот контракт)

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