当你可以做一个接口时,抽象类有啥意义[重复]
Posted
技术标签:
【中文标题】当你可以做一个接口时,抽象类有啥意义[重复]【英文标题】:What is the point of abstract classes, when you could just do an interface [duplicate]当你可以做一个接口时,抽象类有什么意义[重复] 【发布时间】:2018-11-17 06:26:00 【问题描述】:我最近开始怀疑,我为什么要使用抽象类,而我可以只做一个具有完全相同功能的接口。考虑以下几点:
abstract class abstractClass
public int a;
public void printText(String str)
System.out.println(str);
如果我有一个扩展它的子类,我肯定会有一个整数 a 和一个名为 printText 的方法。
interface Interface
public int a = 0;
public default void printtext(String str)
System.out.println(str);
如果我有一个类实现它,我肯定会有一个整数 a 和一个方法 printText。
所以,我看到的唯一区别是,通过接口,我创建的任何类都可以实现任意数量的其他接口,但是通过抽象类的扩展,我将无法扩展更多课程。为什么我会去学习抽象类?我希望这个问题不要太宽泛,尽管我明白为什么有些人会这么认为。
【问题讨论】:
那不是一个有效的接口;你不能有一个字段。 并且接口在 Java 8 之前没有默认方法。 你已经在问题中向自己证明了这一点...... 您界面中的a
是一个常量,而不是实例变量。接口不能声明实例变量。
@chrylis 这是一个完全有效的接口,但a
是隐含的公共和静态的。
【参考方案1】:
需要考虑的几点:
在 Java 8 之前接口没有默认方法。
界面中的a
隐含为final
。接口不能定义公共可变字段。
接口不能定义私有(或受保护,或包)字段。
接口不能有保护或封装方法;在 Java 9 之前他们不能有私有方法。
抽象类没有任何这些问题。因此,当您需要做任何这些事情时(除了#1,现在已经存在默认方法),您需要一个抽象类(也许在 addition 到它实现的接口中)。
【讨论】:
从 Java 9 开始,接口可以有私有方法。 @AntonBalaniuc-Doh!我也看到了,但设法忘记了。谢谢。但仍然没有保护或包装,对吧? (他们需要一个新的 package 关键字,因为离开public
不会这样做......)以上是关于当你可以做一个接口时,抽象类有啥意义[重复]的主要内容,如果未能解决你的问题,请参考以下文章