可能重复:
为什么子类构造函数中必须显式调用超类构造函数?
为什么子类构造函数中必须显式调用超类构造函数?这是什么原因?
他们不会。
如果您没有显式调用超级构造函数,那么它等同于调用无参数的超级构造函数。
public class Sub
{
public Sub()
{
// Do some stuff
}
}
相当于:
public class Sub
{
public Sub()
{
super();
// Do some stuff
}
}
如果你想指定参数,那么你确实需要显式调用超类构造函数。在我看来,这是相当合理的 - 你难道真的希望编译器去“猜测”你想要提供哪些参数吗?
class Person {
private Person mother;
private Person father;
public Person(Person mother, Person father) {
assert mother != null && father != null: "Parents can't be null!";
this.mother = mother;
this.father = father;
}
public boolean hasAnyLivingParents() {
return mother.isAlive() || father.isAlive();
}
public boolean isAlive() { return true; }
}
Person
,则必须指定该人的mother
和father
,而hasAnyLivingParents()
方法需要指定这些信息。Employee
,并且您不关心雇员的父母,因此您想编写如下代码:class Employee extends Person {
double salary;
public Employee(double salary) {
this.salary = salary;
}
}
这段代码无法编译,因为我们没有调用 Person
的构造函数,并且也没有默认构造函数。即使这段代码能够编译,调用 (new Employee(50000d)).hasAnyLivingParents()
也会 总是 抛出 NullPointerException
,因为 mother
和 father
字段没有被初始化。
简言之,Java 要求 每个类都必须由某个构造函数进行初始化。如果一个类没有默认构造函数,则必须调用它的其他构造函数来初始化对象。
当子类调用父类中存在的非参数化默认构造函数时,它会隐式地调用该函数。但是当我们向构造函数传递参数时,我们必须显式地调用它。
super()
,它只是将子构造函数的参数传递给父级,仅此而已? - Pereclass Parent
{
Parent(int x) {}
}
class Child extends Parent
{
Child(){} // will not compile.
}
Child()
构造函数的第一行调用super()
,但父类没有无参构造函数。因此,在这种情况下,您必须通过显式调用super(5)
来执行它。
super()
... - Jon SkeetString
参数。如果我扩展我的类,我必须在我的子类中显式声明一个构造函数,该构造函数需要一个String
,并且如果我不想实现进一步的逻辑,只需在其上调用super(myString);
。为什么?为什么编译器不能自动推断出这个呢? - Pere