[英]In Java, what really happens when an interface “extends” another interface?
我是Java编程的新手,现在,我试图理解OOP概念(继承性,多态性等)。
我知道,当子类扩展超类(是否抽象)时,子类构造函数首先调用该超类的构造函数(super())。
我的问题是:
1)接口是否一样? 我读过一些文章说接口没有构造函数,那么它们到底是如何扩展的呢?
2)为什么Java不支持多重继承,但是一个接口可以“ 扩展 ”多个其他接口?
提前致谢。
1)接口是否一样? 我读过一些文章说接口没有构造函数,那么它们到底是如何扩展的呢?
是的,接口中没有构造函数,您将必须定义一个具体类( 实现该接口)来创建该接口类型的对象。
示例:您可以使用javap java.io.Serializable
来检查java.io.Serializable
的配置文件,该配置文件是:
public interface java.io.Serializable {
}
表示没有构造函数。
2)为什么Java不支持多重继承,但是一个接口可以“扩展”多个其他接口?
是的,您可以扩展多个接口,这是因为,如果两个接口包含具有相同签名的抽象方法,那么这对于编译器而言就不会有歧义。 但这不是类的情况,如果您尝试扩展两个具有相同签名方法的类,那么对于编译器来说,在不同的类中作为方法声明调用的方法可能有所不同,这将是模棱两可。
是的,您可以做到。 一个接口可以扩展多个接口。
interface Maininterface extends inter1, inter2, inter3{
// methods
}
不仅接口,单个类还可以实现多个接口。 那么显然会产生疑问,如果两个方法具有相同的方法名称该怎么办。
有一个棘手的问题:
interface A
{
void test();
}
interface B
{
void test();
}
class C implements A, B
{
@Override
public void test() {
}
}
然后,单个实现对这两个都起作用:)
1)接口是否一样?
并不是的。 接口的构造函数实际上没有任何意义,因为构造函数定义了一些初始状态,但是接口没有状态。 因此,不会调用构造函数。
我读过一些文章说接口没有构造函数,那么它们到底是如何扩展的呢?
您应该考虑将接口扩展为更多类型的扩展,即扩展某种对象的定义行为。 这就像签订合同并在末尾添加一些子句–您说的是“ 除了超级接口中定义的方法之外 ,我还希望实现该接口的类也实现______”
扩展类有点类似,因为您也扩展了类型,但事实是,扩展类应被视为为类型添加了其他状态/实现。 因此,应调用超类构造函数以确保与超类定义关联的所有状态都已正确初始化。
2)为什么Java不支持多重继承,但是一个接口可以“扩展”多个其他接口?
您在这里必须要小心,因为不仅仅是一种多重继承。 Java 确实支持类型的多重继承,这就是为什么您可以实现定义类型的多个接口的原因。 Java不支持状态的多重继承(并且直到Java 8才允许实现多重继承。请参见下面的注释)。 这就是为什么您只能扩展1个类的原因-因为类定义状态。
因此,由于允许您继承多个类型,因此对于给定的接口扩展多个接口是完全可以的。 这就像拿一份合同,然后在其后面装订其他几份合同一样。 只要实现类遵循整个过程,您的程序就应该编译。
注意:从Java 8开始,您现在可以通过接口中的default
方法继承多个实现。 在发生冲突的情况下,程序员必须明确实现所讨论的方法。
首先,尝试清除inheritance
的概念。 继承的基本概念是继承(获取)父类的所有属性(变量和方法)(考虑访问修饰符),并在子类中进行重写。
假设我们有Class A
,
class A{
public void doA()
{
}
}
现在如果class B
扩展 A
( 扩展标记的字面意思),它会获得方法doA()
本质上。 如果您看一下实际上B extends A
的文字部分,则似乎B
是A
的扩展版本。
现在进入界面部分。 如果我有接口InA
interface InA{
doInA();
}
我试图在class B
继承它,我需要implement
(再次标记文字)。 所以我将获得方法doInA()
它B
但是我需要给它一个主体。
在使用Interface to Interface的情况下,现在您已经使用了两个关键字进行继承。 如果我问您interface InB
将继承interface InA
,您将在extends
和implements
选择哪些关键工作? 扩展听起来不合逻辑。 因为InB
没有实现任何东西,它只会变得更大,它将是InA
的扩展版本。
现在让我们回答两个关键问题:
1.Is it the same case for Interfaces?
是和否实际上,仅在调用child的构造函数时才调用parent的构造函数。 因此,由于您永远无法调用子接口的构造函数,因此将不会调用父接口的构造函数。 它不调用父构造函数,但仍保留构造函数调用的技术。
2) How come multiple inheritance is not supported in Java but an interface can "extend" multiple other interfaces?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.