为什么抽象类不能继承接口?

13
我在想为什么一个抽象类不能继承一个接口。
因为我们不能实例化抽象类,所以我能否只继承接口,然后在扩展抽象类的类中覆盖那些方法?
例如:
abstract class AbstractClass extends InterfaceA 
{

}

interface InterfaceA
{
   public void methodToBeImplemented();
}

class MyClass extends AbstractClass
{
  @Override
  public void methodToBeImplemented(){
      //do something
  }
}  

1
因为这就是语言的定义方式。 - user207421
3个回答

23

因为你不是extends一个接口 - 你要implements它。

interface InterfaceA
{
   public void methodToBeImplemented();
}

abstract class AbstractClass implements InterfaceA 
{

}

class MyClass extends AbstractClass
{
  @Override
  public void methodToBeImplemented(){
      //do something
  }
}  

抽象类仍然是一个类,就像其他任何类一样。只有接口可以extends其他接口。


1
是的,我知道语法错误。 这是故意的。 - Qix - MONICA WAS MISTREATED
2
我不是那个点踩者,但你为什么不一致呢?应该是“implements”吧? - DaoWen
@DaoWen 是的,应该没问题。 :) - Qix - MONICA WAS MISTREATED
2
@Qix 当你写下“you implements it”时,我实际上听到了Popeye的声音——谢谢你让我开怀大笑! - Kevin Day

5

您可以在Java中扩展接口,但仍然称之为接口。

然后,您可以在抽象类中实现此扩展接口。

interface InterfaceName
{
    public void foo();
}

public interface ExtendedInterface extends InterfaceName
{
    public void bar();
}

public class ClassName implements ExtendedInteface 
{
    //implementation for all methods in InterfaceName and ExtendedInteface
    ...
}

Praveen,这只是设计师设计的方式。它回归到Java哲学和类和接口的使用方式。假设您有以下类:Student、Professor、Employee和Technician。以及以下接口:Demography、Paydetails和Personaldetails。
理想情况下,教授和技术人员类都可以从员工类扩展,并且这是有意义的。但是,请想象一下从人口统计信息或个人详细信息类中扩展技术人员类。这没有意义。这就像将sky类从blue类中扩展一样。仅仅因为你能做到并不意味着你应该这样做。然而,让技术人员类从员工类扩展并实现诸如Paydetails或demography之类的接口更有意义。这就像将sky类从nature类中扩展,但实现了blue接口(赋予其蓝色功能能力)。
这就是为什么Java开发人员反对多重继承(不像cpp),而是使用接口的基本原因。在您的问题中,类是否抽象并不重要。您不能简单地扩展接口,因为从逻辑上讲这是没有意义的。

2
也许一个例子会更好地说明这个答案? - Qix - MONICA WAS MISTREATED
是的!我知道只有接口可以扩展另一个接口,但我的问题是,为什么Sun/Oracle不允许抽象类扩展接口,就像(接口扩展接口)一样?如果实际上允许这样做会有什么后果? - Praveen Reddy Katta
1
同时扩展多个接口是允许的,但对于类则不然。 - user3465651
虽然你可以实现多个接口 :) - Qix - MONICA WAS MISTREATED

1
在接口中只能扩展接口。当我们在类中使用接口时,需要在类中实现它。另一件事是抽象类包含抽象和非抽象方法,而接口仅包含定义在接口(子类)中实现的抽象方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接