繁体   English   中英

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

[英]What happens when printing an object in java

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); ,我得到的结果为“data@1ae73783” System.out.println(dObj); System.out.println(b);为“5” System.out.println(b);

然后我进行了调试以检查打印对象时真正发生了什么,在调试模式下调用了很多参数(如类加载器,听听)
我知道第一次打印值代表类名,然后是地址。 但是不知道在调试模式下到底发生了什么,因为第二次打印仅在调试模式下发生了变量赋值,即 b=5。

请解释一下到底发生了什么?

您不需要调试器就能知道发生了什么。 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 方法返回一个字符串,该字符串由对象是其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示组成。 换句话说,此方法返回一个等于以下值的字符串:

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

请解释一下到底发生了什么?

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

ClassName@MemoryLocation

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

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

原始数据类型由一个不同的、更简单的 println 实现处理。 除了 Object 之外的所有数据类型都覆盖了 println 方法。

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

data dObj = new data() 在源代码中不存在; 要打印对象(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);
  }
}

除了@JB Nizet 的回答,

为了提供我们自己的字符串表示,我们必须在我们的类中重写 toString() ,这是强烈推荐的,因为

有一些类已经覆盖toString() 以获得正确的字符串表示形式。

示例: StringStringBufferStringBuilder和所有包装

    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

多尔坦·罗伊

岩石

约书亚记

希望这会有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM