关于java:当你可以做一个接口时,抽象类有什么意义呢

What is the point of abstract classes, when you could just do an interface

本问题已经有最佳答案,请猛点这里访问。

我最近开始想,为什么我会使用一个抽象类,当我可以做一个功能完全相同的接口时。考虑以下内容:

1
2
3
4
5
6
7
8
abstract class abstractClass {

    public int a;

        public void printText(String str) {
        System.out.println(str);
    }
}

如果我有一个子类扩展它,我肯定会有一个整数A和一个名为printtext的方法。

1
2
3
4
5
6
7
8
interface Interface{

    public int a = 0;

    public default void printtext(String str) {
        System.out.println(str);
    }
}

如果我有一个类实现这个,我肯定会有一个整数A和一个方法printtext。

所以,我看到的唯一区别是,通过接口,我创建的任何类都可以实现我想要的任何其他接口,但是通过抽象类的扩展,我将不允许扩展更多的类。我为什么要上抽象课?我希望这个问题不要太宽泛,尽管我明白为什么有些人会这么认为。


需要考虑的几点:

  • 在Java 8之前,接口没有默认方法。

  • 接口中的a是隐含的final。接口无法定义公共可变字段。

  • 接口无法定义私有(或受保护或包)字段。

  • 接口不能有保护或封装方法;在Java 9之前,它们不能有私有方法。

  • 抽象类没有这些问题。因此,当您需要执行这些操作时(除了1,现在已经存在默认方法),您需要访问一个抽象类(可能除了它实现的接口之外)。