Object.toString()显示错了class?

Object.toString() show the wrong class?

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

这是我用来测试的相关内容(我们不关心我测试的是什么):

private void launch(){
        System.out.println("DIAGNOSIS ");
        System.out.println("commands size: "+commands.size());
        System.out.println("commands top element: "+commands.peek());
        SimpleCommand command = commands.peek();
        System.out.println("simple command peek :"+command);

        if(!isEmpty()) {
            commands.peek().apply();
            countDown.reset(delays.peek());
            countDown.run();
        }
    }

在这里,调试 window 向我显示的内容:

当我在 SimpleCommand.class 的实例上调用 toString() 时你可以看到 它表明给定的对象实际上是一个 BattleInteractionMachine.class (BIM)。这应该很明显,但我想说明我没有覆盖 Object.class

中的 toString 方法

然而,那两个 类 彼此没有关系

SimpleCommand 继承树:SimpleCommand < Command < Object

BIM 继承树:BIM < MachineState < Object

我完全不知道这怎么可能... 关于它如何发生的任何想法?我不寻求针对我的案例的具体答案,而是寻求对这个问题如何上升的一般理解。

commands.peek() 返回的对象 不是 一个 BattleInteractionMachine 对象。

您错过了显示名称的 </code></strong> 部分,它是返回对象的 class 名称的一部分。 <code>@ 符号之前的任何内容都是完全限定的 class 名称。

$ 和数字后缀表示该对象是 匿名 class 的实例,定义在 BattleInteractionMachine class.

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

例如像这样:

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