2015-12-07 4 views
0
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 пустым и вызовет супер-конструктор в классе конструктора классов no-arg, будет вызван конструктор Employee. Но что, если в классе Person есть параметризованный конструктор. Какой супер конструктор будет называться? Сотрудник один или человек один?Какой супер конструктор будет называться? И супер конструктор все еще вызывается, если я не вызываю супер-конструктор в подклассе?

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

+6

Почему бы не попробовать? –

ответ

0

Но что, если в классе 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 

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

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

+0

Не нужно иметь аргумент 'String' для каждого конструктора. Вам просто нужен фактический аргумент для соответствия формальному аргументу. Например, конструктор 'Child' может быть без параметров и начинаться с' super («Я - ребенок»); ' –

+0

@PatriciaShanahan. Вы правы, спасибо за напоминание. Я отредактировал его. – user3437460

2

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

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

Смежные вопросы