我花了很长时间考虑这个练习,但我无法理解这个问题的含义。本节讨论扩展类以及从扩展类构造对象时发生事件的顺序。
创建对象时,会为其所有字段分配内存,包括从超类继承的字段, 并且这些字段设置为其各自类型的默认初始值(对于所有数字类型为零,为false 对于boolean,'\ u0000'表示char,null表示对象引用)。在此之后,建设有三个 阶段:
- 调用超类的构造函数。
- 使用初始化程序和任何启动块初始化字段。
- 执行构造函数的主体。
醇>...
练习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 :(得分:2)
我认为练习是为了说明实例化Y时会发生什么,即Y y = new Y();
。我不认为他们解释得那么好,因为第2项没有描述它意味着什么领域(类或超类)。如果将代码放入调试器并停在不同的语句中,则在执行上述语句时会发现以下执行顺序:
所以这将是预期的行为 - 无论X对变量等做什么,都是在Y获得任何控制之前完成的; Y不应该'知道'X是如何实现的,它只是假设使用X(希望)记录下来。
我希望这是一个帮助。我不喜欢这本书将这种行为描述为“问题”;我这里没有看到“问题”。为了编写扩展X的Y,你需要知道影响你的X行为的外部可见部分。在这种情况下,X给fullmask
一个值,您在Y构造函数中使用它。