Объект p инициализируется своим подкласом.
Почему поле s не перекрывается?
class Launcher
{
public static void main(String[] args)
{
Parent p = new Child();
System.out.println(p.s);
}
}
class Parent
{
String s = "Parent";
}
class Child extends Parent
{
String s = "Child";
}
Примечание:
Иначе говоря, почему в консоль выводится "Parent"?
Примечание:
Спасибо за ответы.
Мне интересен сам механизм. И кажется я понял почему так происходит.
Здесь очень хорошее объяснение:
http://devdoc.web-ide.ru/index.php/content/view/virtual_base.htm
Правда для C++, но очень похоже на поведение Java (в которой все методы виртуальны).
Получается при создании объекта в памяти размещаются все поля суперклассов (начиная с самого высокого - Object, далее Parent) и за ним уже поля используемого класса Child.
Совпадающие имена не перегружаются (в отличии от методов, для которых изменяются ссылки на функции в таблице виртуальных функций).
И так как объект p - объект типа Parent, то он ничего не знает о расположенным за Parent.s далее в памяти поле Child.s.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.