首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java编程语言第4版练习3.3

Java编程语言第4版练习3.3
EN

Stack Overflow用户
提问于 2016-05-22 09:28:57
回答 1查看 125关注 0票数 0

我花了很长时间思考这个练习,我无法思考这个问题意味着什么。本节讨论扩展类以及从扩展类构造对象时发生的事情的顺序。

创建对象时,为其所有字段(包括从超类继承的字段)分配内存,并将这些字段设置为各自类型的默认值(所有数字类型为零,布尔值为false,字符为‘\u0000,对象引用为null )。在此之后,建筑分为三个阶段:

  1. 调用超类的构造函数。
  2. 使用初始化器和任何初始化块初始化字段。
  3. 执行构造函数的主体。

..。

练习3.3:如果在构造过程中使用扩展类的值设置这些掩码至关重要,那么如何解决这些问题?

代码:

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-22 09:56:54

我认为这个练习是为了说明当你实例化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。

这就是预期的行为--无论X对变量做什么,都是在Y得到任何控制之前完成的;Y不应该‘知道’X是如何实现的,它应该使用X,因为(希望)它被记录为行为。

希望这能帮上忙。我不喜欢这本书把这种行为描述为“问题”,我在这里没有看到“问题”。为了写出扩展X的Y,您需要知道X的外部可见部分影响到您。在本例中,X为fullmask提供了一个特定的值,您可以在Y构造函数中使用这个值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37372591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档