Java编程语言第4版练习3.3

时间:2016-05-22 09:28:58

标签: java

我花了很长时间考虑这个练习,但我无法理解这个问题的含义。本节讨论扩展类以及从扩展类构造对象时发生事件的顺序。

  

创建对象时,会为其所有字段分配内存,包括从超类继承的字段,   并且这些字段设置为其各自类型的默认初始值(对于所有数字类型为零,为false   对于boolean,'\ u0000'表示char,null表示对象引用)。在此之后,建设有三个   阶段:

     
      
  1. 调用超类的构造函数。
  2.   
  3. 使用初始化程序和任何启动块初始化字段。
  4.   
  5. 执行构造函数的主体。
  6.         

    ...

         

    练习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;
    }
}

1 个答案:

答案 0 :(得分: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使用yMask获取fullMask。
  7. 所以这将是预期的行为 - 无论X对变量等做什么,都是在Y获得任何控制之前完成的; Y不应该'知道'X是如何实现的,它只是假设使用X(希望)记录下来。

    我希望这是一个帮助。我不喜欢这本书将这种行为描述为“问题”;我这里没有看到“问题”。为了编写扩展X的Y,你需要知道影响你的X行为的外部可见部分。在这种情况下,X给fullmask一个值,您在Y构造函数中使用它。