Java Object.toString()是否显示了错误的类?

Java Object.toString()是否显示了错误的类?,java,tostring,Java,Tostring,我在调试一些代码时遇到了一个奇怪的问题 以下是我用来测试某些东西的相关信息(我们不关心我测试什么): 在这里,调试窗口显示的内容如下: 正如我在SimpleCommand.class实例上调用toString()时所看到的 它表明给定的对象实际上是一个BattleInteractionMachine.class(BIM)。这应该很明显,但我想指定我没有从Object.class重写toString方法 然而,这两个类之间并不相关 SimpleCommand内在树:SimpleCommand

我在调试一些代码时遇到了一个奇怪的问题

以下是我用来测试某些东西的相关信息(我们不关心我测试什么):

在这里,调试窗口显示的内容如下:

正如我在SimpleCommand.class实例上调用toString()时所看到的 它表明给定的对象实际上是一个BattleInteractionMachine.class(BIM)。这应该很明显,但我想指定我没有从Object.class重写toString方法

然而,这两个类之间并不相关

SimpleCommand内在树:SimpleCommand BIM内在树:BIM 我完全不知道这是怎么可能的。。。
你知道怎么会这样吗?我并不寻求我的案例的具体答案,而是对这个问题如何产生的一般理解。

命令返回的对象。peek()
不是
BattleInteractionMachine
对象

您错过了显示名称的
$3
部分,该部分是返回对象的类名的一部分。
@
符号前面的任何内容都是完全限定的类名

$
和数字后缀表示该对象是
BattleInteractionMachine
类中定义的匿名类的实例

数字3表示BIM至少声明了另外两个匿名类,因为编号通常以1开头。如果您可以在文件系统或
.jar
文件中看到
BattleInteractionMachine.class
,您还可以看到其他
BattleInteractionMachine$XXX.class
文件,其中XXX可以是一个数字、一个名称或更复杂的东西

例如,类似这样的事情:

class BattleInteractionMachine {
    // ...
    void somemethod() {
        // ...
        SimpleCommand command = new SimpleCommand() {
            // methods here
        }
        // ...
    }
    // ...
}

这是无法回避的<代码>战斗交互机器必须覆盖
toString()
。您可以添加一些奇特的反射代码来断言所有命令都实现它们自己的
toString()
,但是我建议不要这样做。试着创建一个和你的问题。如何定义和填充
命令
我猜
简单命令和它的层次结构都是接口,在某种程度上它是在
战机交互机的层次结构中实现的,否则代码就无法编译,否则会出现类强制转换异常。事实上,变量命令被声明为
SimpleCommand
并没有说明引用的对象到底是什么。它可以是扩展或实现
SimpleCommand
的任何内容。重要的是,
commands.peek()
真正返回的是什么。谢谢!!我注意到,如果SimpleCommand实例不是匿名类,那么toString()方法可以识别我的类的实例,但我没有注意到$3。现在你的回答清楚了原因!
class BattleInteractionMachine {
    // ...
    void somemethod() {
        // ...
        SimpleCommand command = new SimpleCommand() {
            // methods here
        }
        // ...
    }
    // ...
}