2013-10-22 125 views
0

在Java中,为什么我不能从接口继承?为什么不能从接口继承

如果接口没有提供方法的实现,那么我们如何能够从Abstract Classes继承。

+2

你的前提是错误的。你*可以*从接口继承。你目前不能从接口继承*实现*,但这一切都与接口没有实现让你继承的事实有关。 –

回答

12

简而言之,你不能继承接口,因为接口只提供抽象,而不是功能。从下面的评论

注意事项(感谢@马克Peters和@qqilihq):

  • Interfaces can inherit from interfaces
  • 既抽象类和接口都继承的形式,但目前只有抽象类支持代码继承。接口提供类型继承。在Java 8中,接口也会提供代码继承。

您还可以检查Official Java Tutorials,这是Java知识的一个很好的起点。

+1

简单而准确,就像这样的评论:) – Maroun

+1

等待Java 8.我会说这两种都是继承的形式,但目前只有抽象类支持实现继承。接口提供类型继承。在Java 8中,接口也会提供代码继承。 –

+2

[另外]接口*可以从接口继承。 – qqilihq

3

这是因为抽象类和接口本质上是不同类型的对象。抽象类定义了功能,而继承则作为框架。

编辑:正如我上面贴只要你想,你可以继承多个接口,但只有一个抽象类

0

的Java支持通过EXTENDS关键字只有单继承。这个想法是,你可以从同一个类的多个接口“继承”。

因此,IMPLEMENTS关键字用于“继承”一个接口。

IMPLEMENTS一个接口可以访问接口中所有声明的类。

0

其实你可以继承接口 - 但只能扩展它们的接口。

您可以创建abstract类来完成接口所需的部分或全部工作。

然后你可以extend你的abstract类来做真正的类。如果您愿意,甚至可以从抽象类中覆盖功能。

// close 
interface Closeable { 
    public void close(); 

} 

// open and close 
interface Openable extends Closeable { 
    public void open(); 

} 

// Simplistic implementation 
abstract class AbstractCloseable implements Closeable { 

    @Override 
    public void close() { 
    System.out.println(this.getClass().getSimpleName() + "-close"); 
    } 

} 

// Simplistic implementation 
abstract class AbstractOpenable extends AbstractCloseable implements Openable { 
    boolean open = false; 

    @Override 
    public void open() { 
    System.out.println(this.getClass().getSimpleName() + "-open"); 
    open = true; 
    } 

    @Override 
    public void close() { 
    super.close(); 
    open = false; 
    } 

} 

class PortHole extends AbstractOpenable implements Openable { 

    public void clean() { 
    if (!open) { 
     System.out.println(this.getClass().getSimpleName() + "-clean"); 
    } else { 
     System.out.println(this.getClass().getSimpleName() + "-fall out"); 

    } 
    } 

} 

public void test() { 
    System.out.println("Hello"); 
    PortHole p = new PortHole(); 
    p.open(); 
    p.clean(); 
    p.close(); 
    p.clean(); 
} 

打印:

PortHole-open 
PortHole-fall out 
PortHole-close 
PortHole-clean