在Java中,当接口“扩展”另一个接口时真正发生了什么?

时间:2014-07-04 07:01:47

标签: java oop inheritance interface constructor

我是Java编程的新手,现在,我正在尝试理解OOP概念(继承,多态性等)。

我知道,当子类扩展超类(抽象与否)时,子类构造函数首先调用该超类的构造函数(super())。

我的问题是:

1)接口的情况是否相同?我读过一些文章说接口没有构造函数,那么它们究竟是如何扩展的呢?

2)为什么Java中不支持多继承,但接口可以“扩展”多个其他接口?

提前致谢。

4 个答案:

答案 0 :(得分:1)

  

1)接口的情况是否相同?我读过一些文章说接口没有构造函数,那么它们究竟是如何扩展的呢?

是的,接口中没有构造函数,您必须定义一个具体的类(实现该接口)来创建该接口类型的对象。

示例:您可以使用java.io.Serializable检查javap java.io.Serializable的个人资料,即:

public interface java.io.Serializable {
}

表示没有构造函数。

  

2)为什么Java中不支持多继承,但接口可以“扩展”多个其他接口?

是的,您可以扩展多个接口,这是因为,如果两个接口包含具有相同签名的 abstract 方法,则这对编译器来说不会有歧义。但这不是类的情况,如果你试图扩展两个具有相同签名的方法的类,那么对于编译器来说,作为方法声明调用的方法在不同的类中可能会有所不同,这将是一个歧义。

答案 1 :(得分:0)

是的,你可以做到。接口可以扩展多个接口。

interface Maininterface extends inter1, inter2, inter3{  
  // methods
}

不仅是接口,单个类还可以实现多个接口。然后显然有一个疑问,如果两个方法具有相同的方法名称会怎么样。

有一个棘手的问题:

interface A
{
    void test();
}

interface B 
{
    void test();
}

class C implements A, B
{

    @Override
    public void test() {

    }     

}

然后单个实现适用于:)

答案 2 :(得分:0)

  

1)接口的情况是否相同?

不是真的。接口的构造函数没有意义,因为构造函数定义了一些初始状态,但接口没有状态。所以构造函数没有被调用。

  

我读过一些文章说接口没有构造函数,那么它们究竟是如何扩展的呢?

您应该考虑将接口扩展为更多扩展类型 - 即扩展某些内容的已定义行为。这就像签订合同并在最后添加一些条款 - 你说“另外到超级接口中定义的方法,我想要实现这个接口的类实施______“

扩展类有点类似,因为你也扩展了一个类型,但问题是扩展一个类应该被认为是在一个类型中添加额外的状态/实现。因此,应调用超类构造函数以确保与超类定义关联的所有状态都已正确初始化。

  

2)为什么Java中不支持多继承,但接口可以“扩展”多个其他接口?

这里你必须小心,因为不只有一种多重继承。 Java 支持 types 的多重继承,这就是为什么你可以实现定义类型的多个接口的原因。 Java不支持的是 state 的多重继承(在Java 8之前不允许多次继承实现。请参阅下面的注释)。这就是为什么你只能扩展1个类 - 因为类定义了状态。

因此,因为您可以继承多种类型,所以扩展多个接口对于给定的接口来说完全可以。这就像拿一份合同并将其他几份合同钉在后面。只要实现类遵循整个过程,您的程序就应该编译。

注意:从Java 8开始,您现在可以通过接口中的default方法继承多个实现。在发生冲突的情况下,程序员必须明确地实现相关方法。

答案 3 :(得分:0)

首先尝试清除inheritance的概念。继承背后的基本概念是继承(获取)父类的所有属性(变量和方法)(考虑访问修饰符),并在子类中重写它们。

假设我们有Class A

class A{
  public void doA()
  {
  }
}

现在如果class B 延伸 A(标记 extends 的字面意思),它将获得方法doA(),本来就是。如果您实际查看文字部分B extends AB似乎是A的扩展版本。

现在来到界面部分。如果我有一个界面InA

interface InA{
  doInA();
 } 

我尝试在class B继承它,我需要implement(再次标记文字)它。所以我会得到方法doInA() B,但我需要给它一个正文。

如果是接口接口,现在您已经使用了两个关键字进行继承。如果我问你,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?

看看这个Why is there no multiple inheritance in Java, but implementing multiple interfaces is allowed?