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

时间:2013-12-22 23:22:30

标签: 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);
    }
}

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

我运行了上面的代码,我的结果为System.out.println(dObj);的“数据@ 1ae73783”和System.out.println(b);的“5”

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

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

7 个答案:

答案 0 :(得分: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())

答案 1 :(得分:2)

  

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

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

ClassName@MemoryLocation

答案 2 :(得分:2)

当我们打印任何类的对象时,System.out.print()给出类名称的字符串以及对象的内存地址(ClassName @ MemoryAdress)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

首先,int不是Object。这是原始类型。 其次,当Class没有超过toString()方法时,会调用Object类中的toString()

答案 5 :(得分: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);
  }
}

答案 6 :(得分:0)

除了@JB Nizet答案,

要提供我们自己的字符串表示形式,我们必须在我们的类中重写toString(),强烈建议这样做,因为

在某些类中,已经已覆盖toString()以获取正确的字符串表示形式。

示例:字符串 StringBuffer StringBuilder 和所有包装器类< / p>

    Integer ob1 = new Integer("10");
    String ob2 = new String("Doltan Roy");
    StringBuffer ob3 = new StringBuffer("The Rock");
    StringBuilder ob4 = new StringBuilder("The Joshua");

    System.out.println(ob1);
    System.out.println(ob2);
    System.out.println(ob3);
    System.out.println(ob4);

输出:

10

Doltan Roy

岩石

约书亚

希望这会有所帮助!