为什么子类的引用变量不能指向父类的对象?IE
Child obj = new Parent();
但是我们可以反之亦然请用内存视图(堆)回答
为什么子类的引用变量不能指向父类的对象?IE
Child obj = new Parent();
但是我们可以反之亦然请用内存视图(堆)回答
没有任何理由与记忆有关。这要简单得多。子类可以通过添加新方法来扩展其超类的行为。虽然没有给出,但超类具有其子类的所有方法。举个例子:
public class Parent {
public void parentMethod() {}
}
public class Child extends Parent {
public void childMethod() {}
}
现在让我们考虑一下如果您可以将 的实例分配给Parent
type 的变量会发生什么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' 类变量需要 4KB 内存,但我们试图为其分配 2KB 的 'Parent' 类对象。所以编译器抛出异常。