Объясните, пожалуйста, почему нижележащий код выводит:
1 teamlead
1 programmer
Собственно в чем мое непонимание? Изначально код начинает выполняется в конструкторе класса Programmer. Дальше происходит вызов super(...) и мы попадаем в родительский конструктор TeamLead, здесь и начинаются вопросы. В конструкторе TeamLead в данном конкретном случае this будет ссылаться на объект класса Programmer, тогда я не понимаю как ему вообще можно установить атрибут numTeamLead (почему это работает?), если private поля не наследуются дочерними классами.
Второй вопрос - как Java будет искать какой из методов employ() надо вызвать? Тот же вопрос, если модификатор у них изменить на public.
Если оба модификатора доступа у employ() заменить на public, то вывод будет таким:
0 programmer
1 programmer
class Test {
public static void main(String[] args) {
new Programmer(1);
}
public static class TeamLead {
private int numTeamLead;
public TeamLead(int numTeamLead) {
this.numTeamLead = numTeamLead;
employ();
}
private void employ() {
System.out.println(numTeamLead + " teamlead");
}
}
public static class Programmer extends TeamLead {
private int numProgrammer;
public Programmer(int numProgrammer) {
super(numProgrammer);
this.numProgrammer = numProgrammer;
employ();
}
private void employ() {
System.out.println(numProgrammer + " programmer");
}
}
}
Читайте про последовательность вызовов при наследовании класса.
Если вы делаете поле private это поле будет видимо только внутри класса и обращаться к ним можно только через методы. numTeamLead вы ему ставите в кострукторе, который сами вызываете super(numProgrammer).
Что касается если вы сделаете два метода public void employ(){...} то будет выполняться метод описанные в классе наследнике (Programmer), т.к. вы переопределите метод описанный в классе TeamLead.
Да и иерархия у вас странная логичней наоборот TeamLead extends Programmer, но для данного примера это не важно :).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей