Как ищутся методы в суперклассе?

152
05 апреля 2022, 09:10

Объясните, пожалуйста, почему нижележащий код выводит:

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");
            }
        }
    }
Answer 1

Читайте про последовательность вызовов при наследовании класса.

Если вы делаете поле private это поле будет видимо только внутри класса и обращаться к ним можно только через методы. numTeamLead вы ему ставите в кострукторе, который сами вызываете super(numProgrammer).

Что касается если вы сделаете два метода public void employ(){...} то будет выполняться метод описанные в классе наследнике (Programmer), т.к. вы переопределите метод описанный в классе TeamLead.

Да и иерархия у вас странная логичней наоборот TeamLead extends Programmer, но для данного примера это не важно :).

READ ALSO
JFXPanel в Swing приложении

JFXPanel в Swing приложении

Есть приложение, которое начал писать на swingЗатем узнал, что график удобнее нарисовать с помощью JavaFx и JFXPanel Пробую пока примеры отсюда Сам...

164
Failed messages: javax.mail.SendFailedException: Invalid Addresses

Failed messages: javax.mail.SendFailedException: Invalid Addresses

Пытаюсь сделать отправку емейла на фреймворке Spring

172
Responzive background image?

Responzive background image?

как написать такой фон для сайта (адаптив)

204
Как файл с текстом преобразить в массив

Как файл с текстом преобразить в массив

Есть файл с текстом "5 4 6 3 51 23 43 10 12 21"Нужно сделать со всех цифр массив и что бы каждое число было отдельно

158