2013-12-22 36 views
3
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); 
    } 
} 

我想知道打印对象或数字或字符串时发生了什么。在java中打印对象时会发生什么

我跑上面的代码中,我得到的结果是“数据@ 1ae73783”为System.out.println(dObj);和“5”为System.out.println(b);

然后我做了调试,检查什么真的发生了打印物体时,有很多在调试模式下调用的参数(如类加载器,theards)
我知道第一次打印的值代表了类名后跟地址。但不知道在调试模式下真正发生了什么,因为在调试模式下发生第二次打印变量赋值,即b = 5。

请解释真的发生了什么?

+5

Java中的每个引用类型是java.lang.Object'的'亚型,因此继承其'的toString()'方法。如果你的类没有实现这个方法,继承的版本会被调用。你看到的是该方法的结果。 –

+1

格式化...这只是*糟糕的* ...所有'
'是什么? – Doorknob

回答

0

所有对象都继承自java.lang.Object,它具有toString的默认实现。如果一个对象重写这个方法,那么out.print(obj)会在屏幕上放置一些有用的东西。

原始数据类型由不同的,更简单的println实现处理。除Object以外,还会为每个数据类型重写println方法。

0

首先,int不是Object。这是原始类型。 二,当Class没有覆盖toString()方法时,调用Object类的toString()

2

请解释真的发生了什么?

正如其他人所告诉你的,使用System.out.println与一个对象将调用toString方法在该对象上。如果班级没有自己的toString方法,那么这是对超级班的toString的调用。如果超类调用一直回到java.lang.Object,则默认toString方法将打印对象类型的名称(它是什么类),后跟@符号以及对象的内存位置 - 十六进制地址该对象被存储在内存中。

[email protected] 
16

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

打印一个对象,然后终止该行。此方法首先调用String.valueOf(x)以获取打印对象的字符串值,然后像调用print(String)和println()一样执行。

String.valueOf(Object)的Javadoc说:

如果参数为空,则字符串等于 “零”;否则,返回obj.toString()的值。

Object.toString()的Javadoc说:

返回该对象的字符串表示。通常,toString方法返回一个“文本表示”该对象的字符串。结果应该是一个简洁但内容丰富的表述,对于一个人来说很容易阅读。建议所有子类重写此方法。

类Object的toString方法返回一个字符串,其中包含对象为实例的类的名称,符号字符“@”和对象的哈希代码的无符号十六进制表示形式。换句话说,此方法返回一个字符串等于的值:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
0

数据DOBJ =新数据()在源代码中不存在; 你想打印对象(Data)的字符串值,你必须重写toString方法;

尝试这种

public class Program { 
    public static void main(String[] args) { 
    Data data = new Data(); 
    System.out.println(data); 
    } 
} 

class Data { 
    int a = 5; 

    @Override 
    public String toString() { 
    return String.valueOf(a); 
    } 
} 
相关问题