public class Faculty extends Employee {
public static void main(String[] args) {
new Faculty();
}
public Faculty() {
super(“faculty”);
}
}
class Employee extends Person {
private String name;
public Employee() {
name = “no name”;
System.out.println("(3) Employee's no-arg constructor is invoked");
}
public Employee(String s) {
name = s;
System.out.println(s);
}
}
class Person {
//What if there was a parameterized constructor here
// e.g. public Person(String s){
// ... code ...
// }
}
在上面的Java代码中,如果我将Person类留空,并在Faculty类'no-arg构造函数中调用超级构造函数,则会调用Employee的构造函数。但是如果Person类中有参数化构造函数会怎么样呢。将调用哪个超级构造函数?员工一人还是一人?
如果我没有在子类中调用超级构造函数,那么仍然会调用超级构造函数吗?
答案 0 :(得分:2)
如果您将参数化构造函数添加到Employee
,则Person
类不会编译,因为默认情况下不会隐含no-args构造函数,但是Employee
构造函数需要调用它。
现在,如果您的Person
类同时包含无参数和String
- 参数化构造函数(具有相同的Employee
实现),则您的代码将进行编译,并且要么调用Employee
的构造函数仍会首先调用Person
的无参数构造函数。
答案 1 :(得分:0)
但是如果Person类中有参数化构造函数会怎样。
如果你这样做,你会得到一个很好的编译错误。
如果你的超类构造函数有一个参数,你的子类应调用super()
,其中参数与参数匹配。
如果超类构造函数没有任何参数,则您的子类将隐式调用super()
。因此,我们不必再次明确调用class GrandParent
{
public GrandParent(String s){
System.out.println("Calling my grandpa");
}
}
class Parent extends GrandParent
{
public Parent(){
super("");
System.out.println("Calling my pa");
}
}
class Child extends Parent
{
public Child(){
//super() implicitly invoked
System.out.println("Calling my child");
}
}
。
示例:强>
class Test
{
public static void main(String[] args){
new Child();
}
}
运行以下内容:
Calling my grandpa
Calling my pa
Calling my child
你得到:
<root>
<firstTag>
<property key="foo" value="One"/>
<property key="bar" value="Two"/>
</firstTag>
<secondTag>
<property key="foo" value="1"/>
<property key="bar" value="2"/>
</secondTag>
</root>
以上输出回答了您后续的问题:
员工一人还是一人? 如果我不在子类中调用超级构造函数,仍然会调用超级构造函数吗?