Какой суперконструктор будет вызван? И вызывается ли суперконструктор, если я не вызываю суперконструктор в подклассе?

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 пустым и вызову суперконструктор в конструкторе без аргументов класса факультета, будет вызван конструктор сотрудника. Но что, если в классе Person есть параметризованный конструктор. Какой суперконструктор будет вызван? Сотрудник один или человек один?

И вызывается ли суперконструктор, если я не вызываю суперконструктор в подклассе?


person Suhaib Ahmad    schedule 07.12.2015    source источник
comment
Почему бы не попробовать?   -  person Dave Newton    schedule 07.12.2015


Ответы (2)


Но что, если в классе Person есть параметризованный конструктор.

Если вы это сделаете, вы получите хорошую ошибку компиляции.

Если ваш конструктор суперкласса имеет параметр, ваш подкласс должен вызвать super(arguments), где аргументы соответствуют параметру.

Если конструктор суперкласса не имеет параметров, ваш дочерний класс будет неявно вызывать 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

Приведенный выше вывод отвечает на ваши последующие вопросы:

Сотрудник один или человек один? И вызывается ли суперконструктор, если я не вызываю суперконструктор в подклассе?

person user3437460    schedule 07.12.2015
comment
Нет необходимости иметь аргумент String для каждого конструктора. Вам просто нужен фактический аргумент, чтобы соответствовать формальному аргументу. Например, конструктор Child может быть без параметров и начинаться с super("I am a Child");. - person Patricia Shanahan; 07.12.2015
comment
@PatriciaShanahan Вы правы, спасибо, что напомнили. Я отредактировал его. - person user3437460; 07.12.2015

Ваш класс Employee не будет компилироваться, если вы добавите параметризованный конструктор в Person, поскольку по умолчанию конструктор без аргументов больше не будет подразумеваться, но ваши конструкторы Employee должны будут вызывать его.

Теперь, если ваш класс Person содержит как конструктор без аргументов, так и конструктор с параметрами String (с одной и той же реализацией Employee), ваш код будет скомпилирован, и любой вызов конструкторов Employee по-прежнему вызовет сначала конструктор без аргументов Person.

person Mena    schedule 07.12.2015