簡體   English   中英

為什么我不能將父類分配給子類類型的變量?

[英]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

由於cChild類型,因此允許調用方法childMethod() 但由於它確實是一個Parent實例,它沒有這個方法,這會導致編譯器或運行時問題(取決於檢查何時完成)。

反過來也沒有問題,因為您不能通過擴展類來刪除方法。

Parent p = new Child(); //allowed

ChildParent的子類,因此繼承了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM