私はこのエクササイズについて考えるのに長い時間を費やしましたが、質問の意味を頭で囲むことはできません。このセクションでは、拡張されたクラスと、オブジェクトが拡張クラスから構築されたときに起こる順序について説明します。Javaプログラミング言語第4版エクササイズ3.3
オブジェクトが作成されると、メモリは、スーパークラスから継承されたものを含むあらゆる分野に割り当てられた およびそれらのフィールドは、すべての数値型のため、それぞれのタイプの初期値(ゼロをデフォルトに設定されている、偽 用boolean、charの場合は「\ u0000」、オブジェクト参照の場合はnull)。この後、建設には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;
}
}
あなたの質問はありますか? – duffymo
練習の意味は? – London
子クラスを作成するときに処理が行われる順序を理解する。私の素朴な答えは、 "yMaskをスーパークラスに移動する"でしょう。 – duffymo