我知道在 java 中询问接口和抽象类之间的区别是一个非常基本、经典和简单的问题。但这个问题有点不同。
我知道 Java 不支持从多个类继承以避免菱形问题,因此提出了接口的概念作为促进一种多重继承的替代方法。但是,这是接口存在的唯一原因吗?
假设由于某种原因,Java Guys 在其新版本之一中决定克服这一限制并允许从多个类继承,那么抽象类和接口之间会有什么区别?它们只是同义词吗?接口是否仍然有存在的理由,还是只是多余的?
如果一个类只有一个抽象方法,它就是“抽象的”;其他方法可以在抽象类中实现。接口无法做到这一点;它们纯粹是抽象的。
public interface Iface {
void foo() {
System.out.println("Foo");
}
}
$ javac Iface.java iface.java:2:接口方法不能有主体 无效 foo() { ^ 1 个错误
但是如果你谈论的是一个完全抽象的类——所有的方法都是抽象的——那么如果你假设多重继承,我不会立即看到任何真正的剩余差异,不。
重新评论您的上述问题:
而是试图理解如果 Java 允许从多个类继承,它是否会在其语言规范中将接口作为实体。
如果 Java 从第一天开始就有多重继承,很可能不会,因为抽象类已经完成了这项工作。
它们只是同义词吗?接口是否仍然有存在的理由,还是只是多余的?
(由于您似乎意识到将抽象类与接口进行比较是一个常见问题,我假设您知道接口不能有状态或默认方法实现。)
只有抽象方法的类与接口相同,所以是的,从某种意义上说,我猜接口只是语法糖。
在代码中,
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() { ... }
}
相关问题(几乎是一个重复!):
接口已经是一种特殊的抽象类类型,它只允许在其中使用公共抽象方法。
这是一种迫使我们遵守无钻石合同的模式。
因此,如果您制作一个可以检查抽象类是否没有任何实现的编译器,您可以将所有接口替换为抽象类(遵守本合同)
仍然我认为有区别。接口是一个只属于你的实现的契约,即使对多继承的限制被取消。在java中,你可以通过使用接口来派生多继承行为,但这可能不会带来所有的特性真正的多重继承(比如调用它的超类等)它只是一种技术。
抽象类是部分对象实体,也可能包含完整的实现。因此,即使可以扩展多个类,您对接口所做的事情也是不同的。我认为Java中的多重继承和抽象类和接口是不同的。