【问题标题】: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 是隐含的公共和静态的。

标签: java class interface


【解决方案1】:

需要考虑的几点:

  1. 在 Java 8 之前接口没有默认方法。

  2. 界面中的a 隐含为final。接口不能定义公共可变字段。

  3. 接口不能定义私有(或受保护,或包)字段。

  4. 接口不能有保护或封装方法;在 Java 9 之前他们不能有私有方法。

抽象类没有任何这些问题。因此,当您需要做任何这些事情时(除了#1,现在已经存在默认方法),您需要一个抽象类(也许在 addition 到它实现的接口中)。

【讨论】:

  • 从 Java 9 开始,接口可以有私有方法。
  • @AntonBalaniuc-Doh!我也看到了,但设法忘记了。谢谢。但仍然没有保护或包装,对吧? (他们需要一个新的 package 关键字,因为离开 public 不会这样做......)
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2015-11-24
  • 2014-01-15
  • 2012-07-19
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多