据我所知,您的解释是正确的。构造函数背后的主要思想是您可以为对象强制执行有效状态。
考虑一个名为“Rational”的类,它有两个属性:分子 (int) 和分母 (int) 代码如下所示(为简洁起见,我省略了 getter 和 setter)
public class Rational {
private int numerator;
private int denominator;
public Rational(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public double getRationalValue() {
return (double) numerator / denominator;
}
public static void main(String[] args) {
Rational oneFourth = new Rational(1, 4);
System.out.println(oneFourth.getRationalValue());
}
}
如您所见,我编写了一个构造函数,它“要求”分子和分母的值。如果您只有一个默认构造函数,那么任何人都可以在不指定分子或分母的情况下创建 Rational 的实例,并且如果您没有为 int 变量指定值,它们将被初始化为零。每个人都知道,如果你除以零,宇宙就会坍塌,所以我们想避免这种情况。
无论如何,正如您正确解释的那样,构造函数不会生成对象。您应该将它们更多地视为一种称为“后期构造”的方法。
对于基类,总是先调用基类的构造函数。这确保您可以在子类构造函数中访问基类的受保护属性。由于 Java 中的每个类都继承自 Object,因此始终首先调用 Object 构造函数。
以下片段:
public class Base {
protected String baseProperty;
public Base() {
System.out.println("In base constructor");
this.baseProperty = "This gets initialized first";
}
static class Sub extends Base {
private String subProperty;
Sub() {
System.out.println("In sub constructor, baseProperty = " + baseProperty);
}
}
public static void main(String args[]) {
Base base = new Sub();
}
}
印刷:
在基础构造函数中
在子构造函数中,baseProperty = This 首先被初始化