Является ли это динамическим полиморфизмом или нет?

#java #type-conversion #polymorphism #inner-classes #private-methods

Вопрос:

Вывод программы-это A, разве это не должно быть B. Если я изменю модификатор метода в классе A на общедоступный, то результатом будет B. Может кто-нибудь объяснить, что здесь происходит?

Код:

 public class HelloWorld {
    public static void main(String[] args) {
        HelloWorld hw = new HelloWorld();
        hw.createInstance();
    }

    public void createInstance() {
        A b = new B();
        b.isTrue();
    }
    
    public class A {
        private void isTrue() {
            System.out.println("A");
        }
    }
    public class B extends A {
        public void isTrue() { 
            System.out.println("B");
        }
    }
}
 

Вывод: A

Ответ №1:

Если isTrue() бы в A был общедоступным, то isTrue() в B переопределил бы его. (Переопределение означает, что при вызове метода, объявленного в базовом классе, выполняется соответствующий метод в подклассе.)

В этом случае, поскольку isTrue() в A является частным, эти два isTrue() метода независимы. Частные методы не подлежат переопределению.

Поскольку вы вызываете isTrue() переменную типа A, выполняется isTrue() метод в A. Будучи закрытым, в этом случае это не мешает вам получить доступ к методу, потому что весь ваш код находится внутри одного класса, HelloWorld . Если бы ваши классы не были внутренними (или вложенными) классами, вы не смогли бы вызвать закрытый метод из-за пределов класса, в котором он объявлен.

Ответ №2:

Вы создаете экземпляр B, на который указывает экземпляр A. Поскольку isTrue является закрытым, компилятор выдаст ошибку

Если вы сделаете A. isTrue() общедоступным, поскольку вы создали экземпляр B, он выполнит метод B isTrue, поскольку этот метод переопределен

Поскольку ваши классы являются внутренними классами, когда вы вызываете isTrue, на который указывает класс, он выполняет isTrue из A и не применяет переопределение, потому что методы имеют различную видимость. Когда вы делаете isTrue общедоступным, он применяет полиморфизм, поскольку у них один и тот же модификатор.

Путаница заключается в том, что они являются внутренними классами, если бы они не были внутренними классами, ваш код не компилировался бы

Комментарии:

1. Поскольку isTrue является закрытым, компилятор выдаст сообщение об ошибке ссылка на ошибку компиляции отсутствует