[英]Why can't I assign a parent class to a variable of subclass type?
為什么子類的引用變量不能指向父類的對象? IE
Child obj = new Parent();
但是我們可以反之亦然 請用內存視圖(堆)回答
沒有理由與記憶有關。 這要簡單得多。 子類可以通過添加新方法來擴展其超類的行為。 雖然沒有給出,但超類具有其子類的所有方法。 以下面的例子為例:
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”類變量需要 4KB 內存,但我們試圖為它分配 2KB 的“Parent”類對象。 所以編譯器拋出異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.