Java为什么接口扩展接口

我想知道在什么情况下我们从接口扩展接口? 因为,例如

interface A{ public void method1(); } interface B extends A{ public void method2(); } class C implements B{ @Override public void method1(){} @Override public void method2(){} } 

不等于

 interface A{ public void method1(); } interface B{ public void method2(); } class C implements A, B{ @Override public void method1(){} @Override public void method2(){} } 

背后有什么重大原因吗?

重要原因完全取决于接口应该做什么。

如果你有一个界面车辆和一个可驱动的界面,那么所有车辆都是可驾驶的。 没有接口inheritance,每种不同类型的汽车类都需要

 class ChevyVolt implements Vehicle, Drivable class FordEscort implements Vehicle, Drivable class ToyotaPrius implements Vehicle, Drivable 

等等。

就像我说的所有车辆都是可驾驶的,因此更容易:

 class ChevyVolt implements Vehicle class FordEscort implements Vehicle class ToyotaPrius implements Vehicle 

车辆如下:

 interface Vehicle extends Drivable 

而不必考虑它。

是的,它就像在任何其他地方inheritance一样。 如果B A的特化,则应该以这种方式编写。 第二个表示该类恰好实现了2个接口,它们之间没有关系。

从最终结果的角度来看,您可以使用多个接口代替处理层次结构(就像您可以避免在类层次结构中使用inheritance行为一样)。 然而,这会使信息更加分散,并且(如果不是更多)显着地使信息模型的意图混淆。

是的,有一个很大的区别。

在你的第一个例子中,你的新接口B被定义为从A扩展,所以继续, 任何实现B的类都会自动实现A.基本上,你告诉编译器“这里是A的意思,这就是它的意思意思是B,哦, 顺便说一下,所有的B都是A的 !“ 这让你说像……

 class C implements B { ... you implement all of the methods you need... ...blah... ...blah... } A myNewA = new C(); 

这很好。

但是,在你的第二个例子中,你没有声明B扩展A,所以上面的代码不起作用。 当你试图将(第二种)C的实例分配给A的引用时,它会抱怨,因为你没有告诉编译器“所有的B都是A的。” (即BC之间没有关系)

如果你不希望在没有实现A的情况下实现B,你可以使B扩展A.

例:

 interface LivingThing{ public void eat(); } interface Dog extends LivingThing{ public void Bark(); } 

它可以成为一个没有狗的生活,但不可能是一个没有生活的狗。 因此,如果它可以吠叫它也可以吃,但相反的情况并非总是如此。

你说的是对的,但这不仅仅是关于完成我们的工作,如果要求如下:

1)想象一下,有10个接口,不是同时设计的。 例如,Java 7中的AutoCloseable接口。添加了一个新的自动关闭function,直到Java 6才有。

2)如果你设计了一个接口C,它是一个标记接口,并且你想要标记从给定类B派生的所有类,那么最好的解决方案是使用B扩展C而不是去实现C到处。

还有很多原因。 如果你看一下类和层次结构的大图,你可能会自己得到答案。

很高兴帮助Dharam

这里的主要区别在于,在你的第一个例子中,B是A,然后是一些。 这意味着接口B调用method1()和method2(),其中第二个A和B是分开的(接口B没有结束method1()),类C实现A和B.在两个内部类C将覆盖method1 ()和method2()。 我希望这有帮助!