Почему для объекта родительского класса создается экземпляр с использованием конструктора дочернего класса?
Это не то, что там происходит. В этой строке:
parent p = new child();
... вы создаете child
объект, а не parent
объекта. Переменная, которую вы используете для ссылки на нее, p
, имеет тип parent
, что означает, что вы можете использовать только parent
через эту ссылку, но объект является объектом child
. Объект у есть y
, вы просто не можете получить к нему доступ через p
. Вы можете видеть, что, делая это:
parent p = new child();
System.out.println(((child)p).y);
Рассказывая компилятор мы знаем, что p
относится к child
даже если это типа parent
(через «слепок»), мы можем получить доступ к child
Определённые ее части , (Это не очень хорошая практика, когда у вас есть альтернатива.)
Эта способность для разницы (внутри ограничений) между ссылкой, которую вы имеете чему-то, и тем, что она на самом деле называется «полиморфизмом» (с использованием нескольких форм) и является центральным элементом объектно-ориентированного программирования.
Рассмотрим:
class Animal {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
Все Dog
s являются Animal
s, как и все Cat
s, но Dog
s не Cat
s. Предположим, что вы зоомагазин и хотите хранить список животных, у вас есть под рукой:
List<Animal> animals;
Записи могут быть объектами типа Animal
или любой из его подтипов, такие как Dog
и Cat
. Это позволяет вам иметь общие аспекты животных на Animal
, а затем только Dog
- или Cat
- конкретные аспекты (свойства или поведение) на этих типах. Вы можете пропустить свой список Animal
s, действующий на их животное, не беспокоясь о том, являются ли они Dog
s или Cat
s.
Подсказка: какой тип объекта 'p' и его базовый тип? следующий 'y' объявляется в классе' child'. – Satya
«Здесь конструктор дочернего класса вызывается на объект родительского класса». - нет, вы определяете объект, который имеет тип 'child', но остальная часть вашего кода видит его как объект' parent'. – Smutje
Надеюсь, у вас есть словарь, в котором вы можете найти «расширить». В этом контексте ('child extends parent') это означает, что у дочернего класса есть весь родительский класс, плюс некоторые поля и методы. – laune