而是一些奇怪的东西,如创建一个学生对象并打印学生对象结果如下:

输出结果为 Student@16d3586,为什么会输出这么一个结果呢?
通过查看java API我们可以得知,Java直接输出一个类的对象的时候,会自动调用这个类的toString方法
这个方法在位于object类中的,而在Java中所有的类都继承Object类,所以所有的类都有toString方法。
通过源码我们发现该方法的实现是这样的:
输出的结果是:
类所在的包名.类名 + @ + 哈希码值
我们尝试获取一个对象的哈希值,打印结果如下

那么hashcode() 获取的哈希码又是什么东西呢?
哈希码表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值
JVM会使用对象的hashcode值来提高对HashMap、Hashtable哈希表存取对象的使用效率
具体如何生成的呢,?紧接着我们进入源码去具体分析:
首先通过以下地址下载源码:
openJDK 7 下载地址1:http://download.java.net/openjdk/jdk7 。
获取源码以后进入openjdkjdksrcshareclassesjavalang 目录下
可以看到 Object.java源码,打开,查看hashCode()的定义如下所示:
public native int hashCode();
native 表示该方法是一个本地方法,Java将调用本地方法库对此方法的实现。
由于Object类中有JNI方法调用,按照JNI的规则,应当生成JNI 的头文件
在此目录下执行 javah -jni java.lang.Object 指令
将生成一java_lang_Object.h头文件
java_lang_Object.h头文件关于hashcode方法的信息如下所示:
然后我们再 打开 openjdkjdksrcshare ativejavalang 目录
查看Object.c文件,可以看到hashCode() 的方法被注册成有 JVM_IHashCode方法指针来处理:
JVM_IHashCode方法指针在 openjdkhotspotsrcsharevmprimsjvm.cpp 中定义,如下:
如上可以看出,JVM_IHashCode方法中调用了ObjectSynchronizer::FastHashCode方法
ObjectSynchronizer::fashHashCode()方法在
openjdkhotspotsrcsharevm untimesynchronizer.cpp 文件中实现,其核心代码实现如下所示:
通过如此复杂的步骤我们终于获取到哈希码值。
而我们在实际开发中,很多时候我们并不想打印对象的哈希码值
而是想获取该对象的具体属性,这个时候该怎么做呢?
我们已知直接打印对象时会自动调用toString方法
该方法是继承于Object类,所以为了能改变内容
很显然我们需要进行toString方法的重写,如下:
重写以后发现我们打印内容不再是哈希码值,而是替换成我们自己想要获取的属性值

版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1070.html