亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

該程序無法使用子類而不是超類來運行

該程序無法使用子類而不是超類來運行

達令說 2023-11-10 16:10:11
有一個類Datacenter,其構造函數是:public Datacenter(        String name,        DatacenterCharacteristics characteristics,        VmAllocationPolicy vmAllocationPolicy,        List<Storage> storageList,        double schedulingInterval) throws Exception {    super(name);    setCharacteristics(characteristics);    setVmAllocationPolicy(vmAllocationPolicy);    setLastProcessTime(0.0);    setStorageList(storageList);    setVmList(new ArrayList<Vm>());    setSchedulingInterval(schedulingInterval);    for (Host host : getCharacteristics().getHostList()) {        host.setDatacenter(this);    }    // If this resource doesn't have any PEs then no useful at all    if (getCharacteristics().getNumberOfPes() == 0) {                throw new Exception(super.getName()                    + " : Error - this entity has no PEs. Therefore, can't process any Cloudlets.");    }    // stores id of this class    getCharacteristics().setId(super.getId());}我們使用這個類在程序中創建數據中心:private static Datacenter createDatacenter(String name, LinkedList myHarddriveList, double timeZone) {    /* Additional codes like defining Hots */    Datacenter datacenter = null;    try {        datacenter = new Datacenter(name, characteristics,                             new VmAllocationPolicySimple(hostList), myHarddriveList, 0);    } catch (Exception e) {                System.out.println("Error: " + e);    }    return datacenter;}程序運行結果如下:問題是,如果我通過擴展Datacenter類來定義自己的數據中心,程序將無法工作。我將MyDatacenter類定義如下:public class MyDatacenter extends Datacenter{    /* My own variables */    public MyDatacenter(String name,            DatacenterCharacteristics characteristics,            VmAllocationPolicy vmAllocationPolicy,           List<Storage> storageList,            double schedulingInterval) throws Exception {        super(name,                 characteristics,                 vmAllocationPolicy,                storageList,                 schedulingInterval);    }    /* My own mwthods */}
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

根據對您問題的評論,問題似乎是您重寫了諸如 等方法setCharacteristics(...)并setSchedulingInterval(...)在超級構造函數中調用這些方法。


如果不了解更多有關系統正在做什么以及重寫這些方法如何影響應用程序內部工作的信息,就很難給出您可能面臨的問題的確切示例。因此,我將嘗試提供一個更抽象的示例,并希望我能夠傳達可能出現問題的想法。


假設我們有以下課程:


class SuperType {

  protected String name;


  public SuperType(String n) {

    setName( n );

  }


  protected void setName( String n ) {

    name = n;

  }    

}


class SubType extends SuperType {

  // setting 'id' happens here

  private int id = new Random().nextInt() + 1;


  {

    // initializer block, setting 'id' could happen here       

  }


  public SubType( String n ) {

    super( n ); 

    // setting 'id' could happen here as well

  }


  @Override

  protected void setName( String n ) {

    name = n + " " + id;

  }    

}

正如您所看到的,重寫了構造函數中使用的SubType方法。為什么這是一個問題?setName(...)SuperType

考慮調用時初始化發生的順序new SubType("some name")

  • 構造函數SubType(...)調用超級構造函數,即SuperType(...)

  • 在執行構造函數之前,將創建并初始化實例。
    對于層次結構中的每個類,從上到下(從超級類型到子類型),這種情況按以下順序發生

    • 字段按照列出的順序排列

    • 初始化塊按照列出的順序排列

    • constructor

因此,我們的示例中有以下執行順序(Object為了簡單起見,我將保留不存在的初始化)

  • SuperType(...)構造函數(因為沒有初始化塊)

  • setName(...)正在被調用,但這是被覆蓋的版本

  • SubType字段被初始化,設置id為隨機數

  • SubType初始化塊運行

  • SubType(...)構造函數運行

正如您所看到的,重寫setName(...)是在id初始化之前執行的,因此該方法將看到的所有內容都將是其默認值(對于primitive 為0 int)。并且根據您的應用程序可能會出現問題 - 重寫的方法可能依賴于正確初始化的一些附加變量(例如不為空),如果沒有發生這種情況,實例可能仍然會被創建,但無法從您的應用程序中使用觀點看法。


查看完整回答
反對 回復 2023-11-10
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

當你有類似的事情時:


Datacenter d = new MyDatacanter(...);

唯一可訪問的方法d是超類中定義的方法Datacenter,除非您將其轉換d為MyDatacenter對象:


d.yourCustomMethod(); //won't work

((MyDataCenter) d).yourCustomMethod(); //should work fine


查看完整回答
反對 回復 2023-11-10
  • 2 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號