2016-07-03 4 views
1

Мы можем достичь той же функциональности, что и интерфейсы, используя абстрактные классы. Так почему Java не позволяет использовать следующий код?Абстрактные классы и множественное наследование

abstract class Animals 
{ 
    public abstract void run(); 
} 

abstract class Animals1 
{ 
    public abstract void run1(); 
} 

class Dog extends Animals,Animals1 
{ 
    public void run() {System.out.println("Run method");} 
    public void run1() {System.out.println("Run1 method");} 
} 

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

+0

Возможный дубликат [Почему множественное наследование не разрешено на Java или C#?] (Http://stackoverflow.com/questions/995255/why-is-multiple-inheritance-not-allowed-in-java-or- c) – eol

+0

Я знаю, почему множественное наследование не разрешено в java и проблема с алмазом, но если вы видите в примере выше, это просто способ, которым интерфейсы были бы реализованы, поэтому возник вопрос об этом. Питер Лору ответил на это в любом случае :) – Zephyr

+0

Согласен .. см. Мои комментарии ниже. – Abhijit

ответ

5

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

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

Примечание: с помощью Java 8 вы не можете работать с интерфейсом, вы можете иметь публичный экземпляр и статические методы с реализациями.

В Java-вы будете иметь возможность private методы в интерфейсах;)

+1

«в состоянии иметь частные методы в интерфейсах» ... действительно! Это первый раз, когда я это услышал. Потому что я считаю, что нынешняя (J8) ситуация нелепо: ваши методы «по умолчанию» в интерфейсах J8 МОГУТ иметь доступ к состоянию ... но только статическое состояние (интерфейсы могут содержать статические поля). Разве это не время, когда они просто сделали возможным множественное наследование и «устаревшие» интерфейсы? И просто заставить компилятор требовать, чтобы подклассы с неопределенностями, гм, устраняли эти двусмысленности? –

+0

@mikerodent Я вижу, что вы указываете, но Брайан Гетц недавно заявил, что состояние будет только на занятиях, поэтому я не вижу, чтобы это скоро изменилось. Состояние не предназначено для интерфейсов, и поле всегда является окончательным (хотя они могут быть изменчивыми). –

0

Это потому, что абстрактные классы все еще классы и наследование отличается от реализации интерфейса. См. the differences between abstract class and interface. Также см. differences between inplementing an interface and extending a class на Java.

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

позволяют также дать вам пример, почему это не должно быть позволено: Предположим, у вас есть как Animals и Animals1 реализующий тот же интерфейс IAnimals:

interface IAnimals 
{ 
    public string eat(); 
} 

abstract class Animals implements IAnimals 
{ 
    public abstract void run(); 
    public string eat(){ return "Animals eating"; } 
} 

abstract class Animals1 implements IAnimals 
{ 
    public abstract void run1(); 
    public string eat(){ return "Animals1 eating"; } 
} 

Если теперь определить свой Dog класс, как вы сделали:

class Dog extends Animals,Animals1 
{ 
    public void run() {System.out.println("Run method");} 
    public void run1() {System.out.println("Run1 method");} 
} 

он будет иметь метод eat() тоже, что не является абстрактным, поэтому он может использовать его непосредственно. Каким будет возврат этого метода для собаки? Какая строка будет возвращена, то есть с животными или с животными1?

Это называется diamond problem, и по этой причине на некоторых языках программирования не допускается множественное наследование.

+0

Если эти ответы отвечают на один и тот же вопрос, вы можете проголосовать, чтобы закрыть это как дубликат. –

+1

@PeterLawrey должен ли я голосовать, чтобы закрыть вопрос, есть ли два ответа, чтобы предоставить информацию по одному вопросу? Конечно, он может найти ответ на свой вопрос, прочитав много статей, но, как он сформулирован, я не думаю, что его вопрос - это «Дубликат» одного из вопросов, которые я предложил. Но я должен признать, что я думал о том же. – meJustAndrew

+0

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

0

Java не поддерживает множественное наследование. - «Одна из причин, почему язык программирования Java не позволяет вам распространять более одного класса, - это избежать проблем с множественным наследованием состояния, которое является способностью наследовать поля из нескольких классов». Источник https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html Вы можете найти эту ссылку полезно.

0

Я согласен с вами (если бы я понял, о чем вы говорите :)), это не нуждается в таких конкретных соглашениях об именах.

interface pet 
{ 

    public abstract void pet(); 
} 

interface pet1 
{ 
    public abstract void pet1(); 
} 

class TestTt implements pet,pet1 
{ 
    public void pet() 
    { 
     System.out.println("this is method of pet interface"); 

    } 

    public void pet1() { 
     System.out.println("this is method of pet1 interface"); 

    } 
    public static void main(String a[]) 
    { 
     pet obj=new TestTt(); 

     pet1 obj1=new TestTt(); 

     obj.pet(); 

     obj1.pet1(); 
    }  
} 

Теперь вот если абстрактный класс позволяет мне создать объект .Затем, я могу создать 2 разных ссылок на 2 абстрактных классов, как в интерфейсе я могу сделать.

Если это так, мне нужны интерфейсы ...?

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

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