[英]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() 以获得正确的字符串表示形式。
示例: String 、 StringBuffer 、 StringBuilder和所有包装类
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.