Инициализация объектов в Java

программирование java ООП

Объект 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.
Ответы:
По той же причине, по которой этот пример выводит "Child". Собеседование? :))
>Примечание №1 07 окт. 2013 г., 16:56:49
>Иначе говоря, почему в консоль выводится "Parent»?
Объект, на который указывает p, имеет тип Parent, хоть он и создан при помощи конструктора Child. А это значит, что объект р ничего «не знает» об объекте Child и его свойствах, он «знает» только свои методы и свойства.
Попробуйте сделать явное приведение типа объекта р к дочернему:
Parent p = new Child();
System.out.println((Child)p.s));
Вот тогда в консоли должно выйти «Child».


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.