Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';当我转换包含变量的对象时,它是否会显示变量的值?_Java_Casting - Fatal编程技术网

Java 为什么';当我转换包含变量的对象时,它是否会显示变量的值?

Java 为什么';当我转换包含变量的对象时,它是否会显示变量的值?,java,casting,Java,Casting,我目前正在尝试比较两个GolfCard对象,我有一个runner类,它调用方法.equals,我在我的GolfCard类中重写了该方法。它工作得非常好,但当我调试它只是为了看看发生了什么时,它显示了非铸造GolfCard对象的face值,但它没有显示铸造GolfCard对象的face值 if (this.face != ((GolfCard)obj).face) 当我在非浇铸对象的面上高亮显示时,它会显示: "face(GolfCard) = 11;" 但当我突出显示浇铸对象的表面时,它会说

我目前正在尝试比较两个GolfCard对象,我有一个runner类,它调用方法
.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,但在问题中值得一提……请在您的问题中添加更多标记,这样我们就可以知道您使用的是哪种语言和/或框架,以及其他值得标记的东西。只是想知道,添加平等性检查的详细信息有什么意义?若你们只是说值并没有显示在浇铸对象中,而是只在调试期间显示在非浇铸对象中,那个么问题就不简单了?哪个调试器?