【问题标题】:The reference of the object changes in every debug每次调试时对象的引用都会发生变化
【发布时间】:2017-02-15 04:57:41
【问题描述】:

毫无疑问,这个问题已经被问过(可能很多次了),但我找不到正确的关键字来找到它们。

基本上,我的问题是关于对象引用。我所知道的是对象引用指向内存上的对象物理位置。但是,当我调试代码时,每次调试时,我都会得到同一个对象的不同对象引用。

例如,当我第一次调试我的代码时,按钮的引用看起来像

信息 [sysout] [AWT-EventQueue-0] [Ljava.awt.event.ComponentListener;@28be012c

第二次是

信息 [sysout] [AWT-EventQueue-0] [Ljava.awt.event.ComponentListener;@31a056d8

我的相关问题是;

1.(@)符号后面的部分(又名@28be012c)是否引用了对象,如果是,它是类似ip地址的东西,不断变化?

2.有没有办法获取一个不随时间变化的地址(如Mac地址)

任何与这些问题相关的答案或链接将不胜感激。

编辑

我正在这种情况下进行调试。有一个按钮,每次单击此按钮时,调试器都会停止。也就是说,程序不是从头开始的。

【问题讨论】:

  • 请定义"each time I debug"。你的意思是你每次都重新运行程序吗?如果是这样,那么您应该不会对每次运行时对象的 hashCode 发生变化感到惊讶。
  • @HovercraftFullOfEels 我编辑了我的答案。
  • 如果你在IDE,那么你也可以跳回去;)
  • @HelloWorld 我发现 jump back 在调试器中不一致。
  • 当“toString()”方法未被覆盖时,您通常会看到类似“SomeClassName@28be012c”的输出。您可以通过覆盖“toString()”来获得一些有用的东西。我不确定,因为我不确切知道您在寻找什么(即您想知道对象在内存中的位置还是只想能够唯一且重复地识别对象)

标签: java object reference pass-by-reference


【解决方案1】:

(@) 符号后面的部分(又名@28be012c)是对对象的引用吗,如果是,它类似于 ip 地址,会发生变化 连续吗?

@ 之后的部分是Integer.toHexString(hashCode());hashCodemethod 并非设计为在每次为不同的运行调用时返回相同的值(即使正在创建的对象具有相同的值)。返回值与内存相关也不是强制性的。 JVM 规范指定应该返回一个唯一值,但它没有指定“如何”。

有没有办法获取地址,不随时间变化 (如 Mac 地址)

没有。 JVM 的每次运行几乎总是会给出不同的哈希码(除非您覆盖 hashCode 方法以返回其他内容。

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多