当前位置:网站首页 > Java基础 > 正文

java基础printstream



我们知道在java中可以直接打印字符串等内容,但是直接将对象进行打印输出时,并不会输出具体值

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


输出结果为 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 文件中实现,其核心代码实现如下所示:

java基础printstream
 

通过如此复杂的步骤我们终于获取到哈希码值。

而我们在实际开发中,很多时候我们并不想打印对象的哈希码值

而是想获取该对象的具体属性,这个时候该怎么做呢?

我们已知直接打印对象时会自动调用toString方法

该方法是继承于Object类,所以为了能改变内容

很显然我们需要进行toString方法的重写,如下:

 

重写以后发现我们打印内容不再是哈希码值,而是替换成我们自己想要获取的属性值

  • 上一篇: o基础学java
  • 下一篇: java基础平台源码
  • 版权声明


    相关文章:

  • o基础学java2025-04-25 19:42:05
  • 谁的java基础2025-04-25 19:42:05
  • java常用基础类2025-04-25 19:42:05
  • 西安java基础2025-04-25 19:42:05
  • java编程基础62025-04-25 19:42:05
  • java基础平台源码2025-04-25 19:42:05
  • 基础java工资2025-04-25 19:42:05
  • java 基础 pdf2025-04-25 19:42:05
  • JAVA基础changeabc2025-04-25 19:42:05
  • java基础教学2032025-04-25 19:42:05