Почему я не могу назначить родительский класс переменной типа подкласса?
Почему ссылочная переменная дочернего класса не может указывать на объект родителя? т.е.
Child obj = new Parent();
Однако мы можем сделать наоборот. Пожалуйста, ответ с представлением памяти (куча)
2 ответа
Нет причины, которая имеет отношение к памяти. Это намного проще. Подкласс может расширить поведение своего суперкласса, добавив новые методы. Пока не дано, что у суперкласса есть все методы его подклассов. Возьмите следующий пример:
public class Parent {
public void parentMethod() {}
}
public class Child extends Parent {
public void childMethod() {}
}
Теперь давайте подумаем о том, что произойдет, если вы могли бы назначить экземпляр Parent
к переменной типа Child
,
Child c = new Parent(); //compiler error
поскольку c
имеет тип Child
разрешено вызывать метод childMethod()
, Но так как это действительно Parent
Экземпляр, который не имеет этого метода, может вызвать проблемы компилятора или времени выполнения (в зависимости от того, когда проверка выполнена).
Обратный путь - не проблема, так как вы не можете удалить методы путем расширения класса.
Parent p = new Child(); //allowed
Child
это подкласс Parent
и, таким образом, наследует parentMethod()
, Таким образом, вы можете вызвать этот метод безопасно.
Ответ слишком запоздал.
Я считаю, что мы можем объяснить это с точки зрения памяти. Может быть, я ошибаюсь, но это то, что я думаю об этом сценарии.
// Assume, Required 2KB for execution
public class Parent {
public void display(){
System.out.println("From Parent");
}
}
// Total memory required for execution : 4bk
public class Child extends Parent {
@Override
public void display() {
super.display(); // 2KB
}
public void sayHello() {
System.out.println("From Child - Hello"); // 2KB
}
}
//2KB expect //4KB assigned
Parent parent = new Child();
//4KB expect //Only 2KB is assigning
Child child = new Parent();
Здесь переменная класса CHILD ожидает 4 КБ памяти, но мы пытаемся назначить ей объекты класса 2 КБ «Родительский». Таким образом, компилятор выдает исключение.