在java中打印对象时会发生什么

Mar*_*jer 4 java object

class Data {
    int a = 5;
}

class Main {
    public static void main(String[] args) {
        int b=5;
        data dObj = new data();
        System.out.println(dObj);
        System.out.println(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道打印对象或数字或字符串时发生了什么.

我运行上面的代码,我得到的结果为"data @ 1ae73783"for System.out.println(dObj);和"5"forSystem.out.println(b);

然后我做了调试来检查打印对象时真的发生了什么,在调试模式中调用了很多参数(比如classloader,theards)
我知道第一次打印时,值表示类名后跟地址.但是不知道在调试模式下究竟发生了什么,因为在调试模式中发生了第二次打印变量赋值,即b = 5.

请解释一下真的发生了什么?

JB *_*zet 18

您不需要调试器就能知道发生了什么.System.out的类型为PrintStream.PrintStream.println(Object)的javadoc 说:

打印一个对象,然后终止该行.此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println().

String.valueOf(Object)的javadoc 说:

如果参数为null,则字符串等于"null"; 否则,返回obj.toString()的值.

Object.toString()的javadoc 说:

返回对象的字符串表示形式.通常,toString方法返回一个"文本表示"此对象的字符串.结果应该是一个简洁但信息丰富的表示,便于人们阅读.建议所有子类都重写此方法.

类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符"@"和对象的哈希码的无符号十六进制表示组成.换句话说,此方法返回一个等于值的字符串:

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


Tho*_*orn 0

所有对象都继承自 java.lang.Object,它具有 toString 的默认实现。如果一个对象重写此方法,则 out.print (obj) 将在屏幕上显示有用的内容。

原始数据类型由 println 的不同的、更简单的实现来处理。除了 Object 之外,每个数据类型都会重写 println 方法。