簡體   English   中英

Java編程語言第4版練習3.3

[英]The Java Programming Language 4th Edition exercise 3.3

我已經花了很長時間思考此練習,但我無法完全理解問題的含義。 本節討論擴展類以及從擴展類構造對象時事物發生的順序。

創建對象時,將為其所有字段(包括從超類繼承的字段)分配內存,並將這些字段的各自類型設置為默認初始值(所有數字類型均為零,布爾值為false,字符型為'\\ u0000' ,對於對象引用為null)。 此后,建設分為三個階段:

  1. 調用超類的構造函數。
  2. 使用字段的初始化程序和任何初始化塊初始化字段。
  3. 執行構造函數的主體。

...

練習3.3:如果在構造過程中使用擴展類中的值設置這些掩碼非常關鍵,那么您如何解決這些問題?

碼:

class X {
    protected int xMask = 0x00ff;
    protected int fullMask;

    public X() {
        fullMask = xMask;
    }

    public int mask(int orig) {
        return (orig & fullMask);
    }
}

class Y extends X {
    protected int yMask = 0xff00;

    public Y() {
        fullMask |= yMask;
    }
}

我認為該練習旨在說明實例化Y時發生的情況,即Y y = new Y(); 我認為他們不能很好地解釋這一切,因為第2項沒有描述其含義(類或超類)。 如果將代碼放入調試器並在不同的語句處停止,則在執行以上語句時會發現以下執行順序:

  1. 調用Y的構造函數,即執行控制傳遞到Y的構造函數的開頭
  2. X的構造函數被調用
  3. X的變量初始化被執行,因此xMask得到0x00ff。
  4. X的構造函數語句已執行,因此fullMask獲取xMask值。
  5. 執行Y的變量初始化,因此yMask得到0xff00;
  6. 執行Y的構造函數語句,使fullMask與yMask一起使用fullMask。

因此,這將是預期的行為-X對變量等所做的任何事情都在Y得到任何控制之前完成; Y不應“知道” X的實現方式,它僅應使用X(如希望的那樣)來表現。

希望對您有所幫助。 我不喜歡本書將這種行為描述為“問題”。 我在這里看不到“問題”。 為了編寫擴展X的Y,您需要知道X的行為的外部可見部分會影響您。 在這種情況下,X為fullmask提供一定的值,您可以在Y構造函數中使用該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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