0

我知道在 java 中询问接口和抽象类之间的区别是一个非常基本、经典和简单的问题。但这个问题有点不同。

我知道 Java 不支持从多个类继承以避免菱形问题,因此提出了接口的概念作为促进一种多重继承的替代方法。但是,这是接口存在的唯一原因吗?

假设由于某种原因,Java Guys 在其新版本之一中决定克服这一限制并允许从多个类继承,那么抽象类和接口之间会有什么区别?它们只是同义词吗?接口是否仍然有存在的理由,还是只是多余的?

4

4 回答 4

3

如果一个类只有一个抽象方法,它就是“抽象的”;其他方法可以在抽象类中实现。接口无法做到这一点;它们纯粹是抽象的。

public interface Iface {
    void foo() {
        System.out.println("Foo");
    }
}
$ javac Iface.java
iface.java:2:接口方法不能有主体
    无效 foo() {
               ^
1 个错误

但是如果你谈论的是一个完全抽象的类——所有的方法都是抽象的——那么如果你假设多重继承,我不会立即看到任何真正的剩余差异,不。


重新评论您的上述问题:

而是试图理解如果 Java 允许从多个类继承,它是否会在其语言规范中将接口作为实体。

如果 Java 从第一天开始就有多重继承,很可能不会,因为抽象类已经完成了这项工作。

于 2012-05-14T08:37:45.303 回答
2

它们只是同义词吗?接口是否仍然有存在的理由,还是只是多余的?

(由于您似乎意识到将抽象类与接口进行比较是一个常见问题,我假设您知道接口不能有状态或默认方法实现。)

只有抽象方法的类与接口相同,所以是的,从某种意义上说,我猜接口只是语法糖。

在代码中,

interface Foo {
    void method();
}

class MyClass extends MyBaseClass implements Foo {
    public void method() { ... }
}

假设说相当于

abstract class Foo {
    public abstract void method();
}

class MyClass extends MyBaseClass, Foo {
    public void method() { ... }
}

相关问题(几乎是一个重复!):

于 2012-05-14T08:38:31.923 回答
0

接口已经是一种特殊的抽象类类型,它只允许在其中使用公共抽象方法。

这是一种迫使我们遵守无钻石合同的模式。

因此,如果您制作一个可以检查抽象类是否没有任何实现的编译器,您可以将所有接口替换为抽象类(遵守本合同)

于 2012-05-14T10:04:01.617 回答
0

仍然我认为有区别。接口是一个只属于你的实现的契约,即使对多继承的限制被取消。在java中,你可以通过使用接口来派生多继承行为,但这可能不会带来所有的特性真正的多重继承(比如调用它的超类等)它只是一种技术。

抽象类是部分对象实体,也可能包含完整的实现。因此,即使可以扩展多个类,您对接口所做的事情也是不同的。我认为Java中的多重继承和抽象类和接口是不同的。

于 2012-05-14T08:40:10.997 回答