摘要 类 和多重继承
Abstract classes and Multiple Inheritance
我们可以通过使用抽象实现与接口相同的功能类,那么为什么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");}
}
我知道只使用接口可以实现多重继承,但上面的代码做的事情与接口做的一样。
这是不允许的,因为您可以使用抽象 classes 做更多的事情。允许多重继承是没有意义的,前提是当您可以使用接口时只使用抽象 class。
对于接口不能做的事情,只使用抽象 classes 更简单,在这种情况下,您将无法使用两个抽象父 classes。
注意:使用 Java 8 时,您无法使用接口进行的操作更少,您可以使用 public 实例和静态方法实现。
在 Java 9 中,您将能够在接口中拥有 private
方法 ;)
这是因为抽象class仍然是class,继承不同于实现接口。请参阅 Java 中的 the differences between abstract class and interface. Also please see differences between inplementing an interface and extending a class。
这两个问题涵盖了您需要了解的所有信息,以了解为什么您不能对抽象 classes 进行多重继承。
另外让我给你举个例子为什么这不应该被允许:假设你有 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:
class Dog extends Animals,Animals1
{
public void run() {System.out.println("Run method");}
public void run1() {System.out.println("Run1 method");}
}
它也会有方法eat()
,它不是抽象的,所以可以直接使用它。对于一只狗来说,这种方法的 return 是什么?哪个字符串将被 returned,带有 Animals 的字符串,还是带有 Animals1 的字符串?
这称为 diamond problem,这也是某些编程语言不允许多重继承的原因。
Java 不支持多重继承。 -" Java 编程语言不允许扩展多个 class 的原因之一是避免状态的多重继承问题,即从多个 [=15] 继承字段的能力=]es." 来源 https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html
您可能会发现此 link 有用。
我同意你的看法(如果我理解你在说什么 :) )不需要这样特定的命名约定。
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();
}
}
现在,如果抽象 class 允许我创建对象。那么,我可以为 2 个抽象 classes 创建 2 个不同的引用,就像我可以在界面中做的那样。
如果是这样,我需要接口...吗?
在 ABSTRACT class 中,我们不能一次扩展多个抽象 classes。
但
在INTERFACE中,我们可以同时实现多个接口。
因此在java.
中使用接口来实现多重继承
我们可以通过使用抽象实现与接口相同的功能类,那么为什么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");}
}
我知道只使用接口可以实现多重继承,但上面的代码做的事情与接口做的一样。
这是不允许的,因为您可以使用抽象 classes 做更多的事情。允许多重继承是没有意义的,前提是当您可以使用接口时只使用抽象 class。
对于接口不能做的事情,只使用抽象 classes 更简单,在这种情况下,您将无法使用两个抽象父 classes。
注意:使用 Java 8 时,您无法使用接口进行的操作更少,您可以使用 public 实例和静态方法实现。
在 Java 9 中,您将能够在接口中拥有 private
方法 ;)
这是因为抽象class仍然是class,继承不同于实现接口。请参阅 Java 中的 the differences between abstract class and interface. Also please see differences between inplementing an interface and extending a class。
这两个问题涵盖了您需要了解的所有信息,以了解为什么您不能对抽象 classes 进行多重继承。
另外让我给你举个例子为什么这不应该被允许:假设你有 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:
class Dog extends Animals,Animals1
{
public void run() {System.out.println("Run method");}
public void run1() {System.out.println("Run1 method");}
}
它也会有方法eat()
,它不是抽象的,所以可以直接使用它。对于一只狗来说,这种方法的 return 是什么?哪个字符串将被 returned,带有 Animals 的字符串,还是带有 Animals1 的字符串?
这称为 diamond problem,这也是某些编程语言不允许多重继承的原因。
Java 不支持多重继承。 -" Java 编程语言不允许扩展多个 class 的原因之一是避免状态的多重继承问题,即从多个 [=15] 继承字段的能力=]es." 来源 https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html 您可能会发现此 link 有用。
我同意你的看法(如果我理解你在说什么 :) )不需要这样特定的命名约定。
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();
}
}
现在,如果抽象 class 允许我创建对象。那么,我可以为 2 个抽象 classes 创建 2 个不同的引用,就像我可以在界面中做的那样。
如果是这样,我需要接口...吗?
在 ABSTRACT class 中,我们不能一次扩展多个抽象 classes。 但 在INTERFACE中,我们可以同时实现多个接口。
因此在java.
中使用接口来实现多重继承