Java 为什么';当我转换包含变量的对象时,它是否会显示变量的值?
我目前正在尝试比较两个GolfCard对象,我有一个runner类,它调用方法Java 为什么';当我转换包含变量的对象时,它是否会显示变量的值?,java,casting,Java,Casting,我目前正在尝试比较两个GolfCard对象,我有一个runner类,它调用方法.equals,我在我的GolfCard类中重写了该方法。它工作得非常好,但当我调试它只是为了看看发生了什么时,它显示了非铸造GolfCard对象的face值,但它没有显示铸造GolfCard对象的face值 if (this.face != ((GolfCard)obj).face) 当我在非浇铸对象的面上高亮显示时,它会显示: "face(GolfCard) = 11;" 但当我突出显示浇铸对象的表面时,它会说
.equals
,我在我的GolfCard类中重写了该方法。它工作得非常好,但当我调试它只是为了看看发生了什么时,它显示了非铸造GolfCard对象的face值,但它没有显示铸造GolfCard对象的face值
if (this.face != ((GolfCard)obj).face)
当我在非浇铸对象的面上高亮显示时,它会显示:
"face(GolfCard) = 11;"
但当我突出显示浇铸对象的表面时,它会说:
"int GolfGame.GolfCard.face"
为什么它会显示非铸造对象变量的值,而不是铸造对象变量的值?因为您的示例中没有铸造对象
((GolfCard)obj).face
是一个包含临时强制转换的表达式,但是您没有任何指定强制转换的GolfCard
类型的局部变量
当您将鼠标悬停在面上时,调试器不会强制转换obj
,因此它将无法向您显示值,因为此时没有值。仅当计算整个表达式((GolfCard)obj).face
时,该值才存在
要查看调试器中的值,可以将整个表达式((GolfCard)obj).face
显式添加到关注的表达式列表中
在Eclipse中,有一个名为“表达式”的窗口,该窗口在调试器透视图中默认可见。如果在那里添加((高尔夫球场)obj).face
,它将显示值
原因主要是性能和稳定性。如果您的编译器在鼠标悬停在每个cast或其他复杂表达式上时都对其进行了求值,那么它将不得不处理潜在的ClassCastException,并始终运行可能复杂的代码,即使您不需要或不想要它。显式表达式允许您告诉它何时您确实希望它执行更复杂的任务,以便在调试期间计算值。您似乎有以下结构:
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
}
}
否则,最好在B
中重命名face
(在java中,字段不是覆盖的,而是添加到数据中。)我猜您的语言是java,但在问题中值得一提……请在您的问题中添加更多标记,这样我们就可以知道您使用的是哪种语言和/或框架,以及其他值得标记的东西。只是想知道,添加平等性检查的详细信息有什么意义?若你们只是说值并没有显示在浇铸对象中,而是只在调试期间显示在非浇铸对象中,那个么问题就不简单了?哪个调试器?