将调用哪个超级构造函数?如果我不在子类中调用超级构造函数,仍然会调用超级构造函数吗?

时间:2015-12-07 15:11:07

标签: java oop inheritance constructor super

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类中有参数化构造函数会怎么样呢。将调用哪个超级构造函数?员工一人还是一人?

如果我没有在子类中调用超级构造函数,那么仍然会调用超级构造函数吗?

2 个答案:

答案 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>

以上输出回答了您后续的问题:

  

员工一人还是一人?   如果我不在子类中调用超级构造函数,仍然会调用超级构造函数吗?