如果已重新定义toString方法,如何打印对象的地址
我是Java的新手。现在,我正在研究equals和==以及对equals和toString的重新定义。
我想同时使用已重新定义的toString方法和从Object类继承的默认方法。
我未能使用该超级修饰符来实现该方法。
这仅用于教育目的。如果您可以看一下我代码中的注释,那么我想得到的内容将更加清楚。
你能在这里帮我吗?
我的代码是:
public class EqualTest{ public static void main(String[] args){
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
//System.out.super.println(alice1);
Employee alice2 = alice1;
//System.out.super.println(alice2);
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
//System.out.super.println(alice3);
System.out.println("alice1==alice2: " + (alice1==alice2));
System.out.println("alice1 == alice3: " + (alice1==alice3));
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
}
}
class Employee{
...
public String toString(){
return getClass().getName() + "[name = " + name +
", salary=" + salary + ", hireDay=" + hireDay + "]";
}
}
回答:
严格来说,您不能在纯Java中打印对象的地址。在产生的字符串中,看起来像对象地址的数字Object.toString()
是对象的“身份哈希码”。它可能与对象的当前地址有关,也可能与之无关:
规范 没有说明 如何计算身份哈希码号。故意将其保留为未指定。
由于该数字是哈希码,因此 无法 更改。因此,即使它(通常)与对象地址有关,也将 是首次访问哈希码时的 对象地址。这可能与当前地址不同,并且自从第一次观察到对象的身份哈希码以来,如果GC已移动对象,则情况也 将 有所不同。
在64位JVM(具有足够大的堆大小/未使用压缩的oops)上,地址将不适合作为ID返回的标识哈希码编号
int
。
无论如何,获取此号码的方法是致电System.identityHashCode(obj)
。
如果您确实想要对象的当前地址,则可以使用JNI和本机方法(以及一些抽象方法)或通过使用Unsafe
类中的方法来获取它。但是请注意,这两种方法都是不可移植的……并且当GC运行时,它们给您的对象地址可能会“中断”。
对于怀疑者来说,这就是Java 10 javadocs在“哈希码!=地址”点上所说的:
“( 实现为对象的内存地址的 。)” *
重点已添加。实际上,对于最新的JVM,默认行为是根本不将hashCode基于内存地址。至少从Java 7开始就是这样。
您可以通过包括-XX:+PrintFlagsFinal
找出hashcode
标志默认值的内容,然后查看OpenJDK源代码以了解其含义来确认这一点。(某些版本的代码位于“
vm / runtime / synchronizer.cpp”文件中,但某些版本为YMMV。)
以上是 如果已重新定义toString方法,如何打印对象的地址 的全部内容, 来源链接: utcz.com/qa/405788.html