我知道已经有一个与此相关的问题,Interface with default methods vs Abstract class in Java 8但是在Java 8发布之前问了这个问题,它只是一个关于抽象类和接口与默认方法之间的区别的要点,它根本没有提供任何实际的例子,而是充满了冗长的解释。
我发布这个问题是因为我对一个实用的例子更感兴趣,它通过Java 8中的默认方法清除了抽象类和接口之间的区别。
看一下这个例子,
抽象类,
abstract class AbstractClass {
public int var = 0;
// These methods must be Overridden
abstract int x();
abstract int y();
// This method is optional
int z() {
return 0;
}
}
界面(Java 8)
interface Interface {
public int var = 0;
// These methods must be Overridden
int x();
int y();
// This method is optional
default int z(){
return 0;
}
}
如果我想向新手Java程序员(比如我自己)解释它的实际区别,我怎么能区分上面两个?
this文章说,
默认方法带来的好处是现在可以实现 向界面添加一个新的默认方法,它不会破坏 的实施方式。
这不可能是默认方法接口的唯一好处,或者是它?
答案 0 :(得分:6)
首先,您应该了解
之间的区别abstract class AbstractClass {
public int var = 0;
…
和
interface Interface {
public int var = 0;
…
public static final int var = 0;
与写作完全不同
public int var = 0;
在abstract
课程中。您已经通过说“Abstract classes can have state”链接的问题已经解释了这种差异。接口只能定义常量。这意味着您无法为default
执行带有实例字段的任何操作提供interface
方法,因为interface
无法定义实例字段。 default
方法只能在其他interface
方法上使用。
有时它真的有助于理解“理性的解释”,而不是要求“一个实际的例子”。换句话说,您链接的问题和答案仍然有效。
关于Java 8中default
方法的目的,那个问题has been asked before也是如此。
总结abstract
类和interface
之间的一些差异:
interface
成员均为public
,您无法定义private
,protected
或包私人成员;当你省略它隐含的public
修饰符时(从Java 9开始,允许使用private
方法)interface
个字段仅用于定义常量;它们是隐含的static final
abstract
类可以有static
类初始化代码和实例构造函数abstract
类可能具有状态,即定义实例字段并提供使用它们的方法abstract
类可以为equals
中定义的方法hashCode
,toString
和java.lang.Object
提供实现,同时在{default
中指定interface
方法1}} s无法覆盖这些方法abstract
个类可以定义final
,strictfp
,synchronized
或native
方法class
只能扩展一个abstract
或具体class
,但可以实现多个interface