Почему дочерний объект вызывает частный метод суперкласса, имеющего основной метод? - PullRequest
0 голосов
/ 30 мая 2020

В приведенном ниже коде объект дочернего класса вызывает свой метод 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");
    }
}

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

1 Ответ

0 голосов
/ 30 мая 2020

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

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

...