为什么在投射包含变量的对象时它不显示变量的值?

时间:2018-08-08 05:15:46

标签: java casting

我当前正在尝试比较两个GolfCard对象,并且我有一个运行器类,它调用方法.equals,在我的GolfCard类中已覆盖该方法。它工作得很好,但是当我调试它只是为了看看发生了什么时,它向我展示了非强制转换的GolfCard对象的面值,但并没有向我显示强制转换的GolfCard对象的面值。

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

当我突出显示非投射对象的脸部时,它表示:

"face(GolfCard) = 11;"

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

"int GolfGame.GolfCard.face"

为什么它向我显示了非铸造对象的变量的值,但没有显示铸造对象的变量的值?

2 个答案:

答案 0 :(得分:1)

因为您的示例中没有强制转换的对象。

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

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

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

在Eclipse中,您有一个名为“表达式”的窗口,该窗口在调试器透视图中是默认可见的。如果在其中添加((GolfCard)obj).face,它将为您显示值。

其原因主要是性能和稳定性。如果您的编译器在用鼠标悬停在每个强制转换或其他复杂表达式上时确实对其求值,则它必须处理潜在的ClassCastExceptions并始终运行可能的复杂代码,即使您不需要或不需要它。显式表达式使您可以在调试过程中告诉它何时执行更复杂的任务来评估值。

答案 1 :(得分:0)

似乎您具有以下构造:

class A {
    int face = 11;
}

class B extends A {
    int face = 42;
}

也就是说,在B类中,有一个新字段face隐藏了A类中的字段face

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

该构造很容易让人误解,也许只是想做:

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

否则,最好在face中重命名B

(在Java字段中,不是 overrideing 而是添加到数据中。)