2016-05-22 4 views
0

私はこのエクササイズについて考えるのに長い時間を費やしましたが、質問の意味を頭で囲むことはできません。このセクションでは、拡張されたクラスと、オブジェクトが拡張クラスから構築されたときに起こる順序について説明します。Javaプログラミング言語第4版エクササイズ3.3

オブジェクトが作成されると、メモリは、スーパークラスから継承されたものを含むあらゆる分野に割り当てられた およびそれらのフィールドは、すべての数値型のため、それぞれのタイプの初期値(ゼロをデフォルトに設定されている、偽 用boolean、charの場合は「\ u0000」、オブジェクト参照の場合はnull)。この後、建設には3つの フェーズがあります。

  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; 
    } 
} 
+0

あなたの質問はありますか? – duffymo

+0

練習の意味は? – London

+0

子クラスを作成するときに処理が行われる順序を理解する。私の素朴な答えは、 "yMaskをスーパークラスに移動する"でしょう。 – duffymo

答えて

2

私は運動があなたが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はfullMaskをyMaskで取得します。

これは予想される動作です.Xが変数などで行うことは、Yが制御を取得する前に行われます。 Yは、Xがどのように実装されているかを「知る」とは考えられていませんが、Xをそのまま使用することを想定しています。

私はそれが助けてくれることを願っています。私は、この行動の「問題」としての本の特徴付けが嫌いです。ここには「問題」はありません。 Xを拡張するYを書くには、あなたに影響を及ぼすXの振る舞いの外部から目に見える部分を知る必要があります。この場合、Xはfullmaskの値をYコンストラクタで使用します。

関連する問題