为什么子类的引用变量不能指向父对象?即
<script type="text/javascript" src="jquery.min.js"></script>
<div id='container'>
<div id='title'>
<h1>Learning Js Properly: Project #1 - Dynamic Quiz</h1>
</div>
<br/>
<div id='quiz'></div>
<div class='button' id='next'><a href='#'>Next</a></div>
<div class='button' id='prev'><a href='#'>Prev</a></div>
<div class='button' id='start'> <a href='#'>Start Over</a></div>
<!-- <button class='' id='next'>Next</a></button>
<button class='' id='prev'>Prev</a></button>
<button class='' id='start'> Start Over</a></button> -->
</div>
然而,我们可以反过来 请回答内存视图(堆)
答案 0 :(得分: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()
。所以你可以节省地调用这个方法。
答案 1 :(得分:-1)
答案为时已晚。
我相信我们可以用记忆来解释它。也许我错了,但这就是我对这种情况的看法。
// 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”类对象。所以编译器抛出异常。