Почему дочерний объект вызывает частный метод суперкласса, имеющего основной метод?

В приведенном ниже коде объект дочернего класса вызывает свой метод getBankName(), но вместо этого вызывается закрытый метод getBankName() родительского класса.

public class Bank {
    private void getBankName() {
        System.out.println("Bank");
    }
    public static void main(String[] args) {
        Bank bank = new MyBank();
        bank.getBankName();
    }
}

class MyBank extends Bank {
    public void getBankName() {
        System.out.println("MyBank");
    }
}

Кроме того, если я изменю спецификатор доступа родительского метода на public, он будет работать нормально (дочерний объект вызывает свой собственный метод и печатает «MyBank»). Почему на вызов влияет только спецификатор доступа родительского метода??


person hitesh    schedule 30.05.2020    source источник
comment
Следует отметить, что соглашение Java заключается в том, что get методы возвращают значение; вместо void тип должен быть String, а вы должны return "Bank".   -  person chrylis -cautiouslyoptimistic-    schedule 30.05.2020
comment
Java не поддерживает переопределение частных методов из-за проблем с безопасностью и инкапсуляцией, проверьте: stackoverflow.com/questions/2000137/.   -  person PatrickChen    schedule 30.05.2020
comment
Очень плохой дизайн. Суперкласс никогда не должен знать подкласс   -  person Jens    schedule 30.05.2020
comment
Дизайн не беспокоит меня в этом вопросе, я просто пытаюсь понять, почему это происходит.   -  person hitesh    schedule 30.05.2020


Ответы (1)


Частные методы не могут быть переопределены; это совершенно разные элементы, такие как переобъявленные (затеняющие) поля.

Когда видимость метода не является закрытой, компилятор использует invokevirtual, которая отвечает за поиск подходящего переопределения и его выполнение. Однако для частного метода компилятор использует invokespecial (см. "Примечания"), который явно не допускает переопределения.

person chrylis -cautiouslyoptimistic-    schedule 30.05.2020
comment
Большое спасибо! Это ответило на мой запрос. :) - person hitesh; 31.05.2020