当你可以做一个接口时,抽象类有啥意义[重复]

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 不会这样做......)

以上是关于当你可以做一个接口时,抽象类有啥意义[重复]的主要内容,如果未能解决你的问题,请参考以下文章

接口和抽象类有啥区别? [复制]

java中接口和类有啥区别 java中接口和类有啥区别

java接口和类有啥区别?

java中接口和类有啥区别java中接口和类有啥区别

Typescript中的接口和抽象类有啥区别?

类型和类有啥区别?