我花了很长时间思考这个练习,我无法思考这个问题意味着什么。本节讨论扩展类以及从扩展类构造对象时发生的事情的顺序。
创建对象时,为其所有字段(包括从超类继承的字段)分配内存,并将这些字段设置为各自类型的默认值(所有数字类型为零,布尔值为false,字符为‘\u0000,对象引用为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;
}
}
发布于 2016-05-22 09:56:54
我认为这个练习是为了说明当你实例化Y,即Y y = new Y();
时会发生什么。我不认为他们解释得那么好,因为第2项没有描述它所指的字段(类或超类)。如果将代码放入调试器并在不同的语句处停止,则在执行上述语句时会发现以下执行顺序:
这就是预期的行为--无论X对变量做什么,都是在Y得到任何控制之前完成的;Y不应该‘知道’X是如何实现的,它应该使用X,因为(希望)它被记录为行为。
希望这能帮上忙。我不喜欢这本书把这种行为描述为“问题”,我在这里没有看到“问题”。为了写出扩展X的Y,您需要知道X的外部可见部分影响到您。在本例中,X为fullmask
提供了一个特定的值,您可以在Y构造函数中使用这个值。
https://stackoverflow.com/questions/37372591
复制相似问题