0

我目前正在尝试比较两个 GolfCard 对象,并且我有一个调用方法的 runner 类,.equals我在 GolfCard 类中重写了该方法。它工作得非常好,但是当我调试它只是为了看看发生了什么时,它向我显示了未铸造的 GolfCard 对象的面值,但它没有向我显示铸造的 GolfCard 对象的面值。

if (this.face != ((GolfCard)obj).face)

当我在未投射对象的面上突出显示时,它说:

"face(GolfCard) = 11;"

但是当我突出显示投射对象的表面时,它会说:

"int GolfGame.GolfCard.face"

为什么它显示非铸造对象的变量的值,而不是铸造对象的变量的值?

4

2 回答 2

1

因为您的示例中没有铸造对象。

((GolfCard)obj).face是一个包含临时转换的表达式,但是您没有GolfCard将转换分配给的任何类型的局部变量。

obj当您将鼠标悬停在 上时,您的调试器不会强制转换face,因此它将无法向您显示值,因为在那个时间点没有值。((GolfCard)obj).face该值仅在评估整个表达式时才存在。

要查看调试器中的值,您可以将整个表达式((GolfCard)obj).face显式添加到监视表达式列表中。

在 Eclipse 中,您有一个名为“Expressions”的窗口,它在调试器透视图中默认可见。如果你在((GolfCard)obj).face那里添加,它会显示你的价值。

其原因主要是性能和稳定性。如果您的编译器在您将鼠标悬停在它上面时确实评估了每个强制转换或其他复杂表达式,那么即使您不需要或不需要它,它也必须处理潜在的 ClassCastExceptions 并一直运行可能复杂的代码。显式表达式允许您告诉它何时确实希望它执行更复杂的任务以在调试期间评估值。

于 2018-08-08T15:00:41.080 回答
0

看来你有这个结构:

class A {
    int face = 11;
}

class B extends A {
    int face = 42;
}

即:在 B 类中有一个新字段face,它隐藏了faceA 类中的一个字段。

一些编译器发出警告“字段隐藏了祖先类的字段”。

这种结构非常具有误导性,也许只是打算这样做:

class B extends A {
    B() {
        face = 42; // A.face
    }
}

否则最好重命名faceB.

(在 java 中,字段不是覆盖而是添加到数据中。)

于 2018-08-08T15:07:29.757 回答