#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 является закрытым, компилятор выдаст сообщение об ошибке — ссылка на ошибку компиляции отсутствует