抽象类中的最后一个变量

2022-09-04 02:29:59

在Java中,我无法创建抽象类的实例。那么,为什么日食不对下面的代码尖叫呢?

public abstract class FooType {
    private final int myvar;

    public FooType() {
        myvar = 1;
    }
}

答案 1

代码很好,最后一个变量在 的构造函数中初始化。FooType

您无法实例化,因为它是抽象的。但是如果你创建一个非抽象的子类,构造函数将被调用。FooTypeFooType

如果在构造函数中没有显式调用,Java 编译器将自动添加它。因此,可以确保调用继承链中每个类的构造函数。super(...)


答案 2

您可以拥有构造函数,方法,属性,抽象类中的所有内容,也可以在非抽象类中拥有。你只是无法实例化类。所以这段代码没有错。

在派生类中,您可以调用构造函数并设置最终属性:

public class Foo extends FooType
{
  public Foo()
  {
    super(); // <-- Call constructor of FooType
  }
}

如果您没有指定对 super() 的调用,则编译器无论如何都会插入它。