在调试java app时,为堆栈框架中的变量显示了哪些信息

use*_*356 8 java

当我在Intellij Idea中调试java应用程序时,我看到堆栈框架中的所有变量都是这样的:

object={java.lang.Object@77}
Run Code Online (Sandbox Code Playgroud)

"@"后面的数字是什么意思?它与hashCode返回的不同.hashCode以十六进制表示形式返回数字2a134eca,等于整数表示中的705908426.数字77和705908426是不同的.

Ric*_*igh 6

@是应用程序启动后的对象计数.所以@ 1012表示自应用程序启动以来创建的第1012个对象.

它不是身份哈希码.

这里有一些证据:(我说这是因为我实际上并不知道,但我观察到了这一点)

public static void main(String [] args) throws Throwable {

    Object object = new Object();
    Object object1 = new Object();
    Integer foo = new Integer(5);
    Object object2 = new Object();
    String str = new String("bar");

    System.out.println("code :" + System.identityHashCode(object));

    RuntimeException exception = new RuntimeException();
    exception.printStackTrace(); //put breakpoint here


}
Run Code Online (Sandbox Code Playgroud)

输出:代码:789451787代码:java.lang.Object@2f0e140b

789451787 = 2f0e140b顺便说一下......

IntelliJ调试器的输出:

static = org.boon.core.MyClass
args = {java.lang.String[0]@**97**}
object = {java.lang.Object@**98**}
object1 = {java.lang.Object@**99**}
foo = {java.lang.Integer@**100**}"5"
object2 = {java.lang.Object@**101**}
str = {java.lang.String@**102**}"bar"
exception = {java.lang.RuntimeException@**103**}"java.lang.RuntimeException"
Run Code Online (Sandbox Code Playgroud)

我根据经验知道,但我不知道实际的实现,但我认为它与这样的问题有关:

as3:调试时有意义的对象识别.


Jun*_*san 5

“@”后面的数字是什么意思?

@ 只是一个分隔符

调试器使用toString对象的方法来显示其值。这里是javadocstoString方法的默认实现的描述:

Object 类的 toString 方法返回一个字符串,该字符串由对象是其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于以下值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)