[英]Java_why print member variable give actual value?
class Customer {
public String name;
public Customer(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Customer c = new Customer("Sally");
System.out.println(c);
System.out.println(c.name);
}
}
请参阅上面的代码和此处的图片传递值
问题:
System.out.println(c);
,IDE 会为我生成一个内存地址: Customer@60e53b93
,该对象有一个成员变量,它是对字符串的引用-> "Sally",为什么当我执行System.out.println(c.name)
,尝试打印出引用(名称)时,它给出了一个真正的字符串对象(“莎莉”)。 它不应该打印真实对象(“Sally”)的内存地址吗???
第一个问题答案:- 1. out
是系统类中PrintStream 的静态变量。 在 System 类中声明为
public final static PrintStream out = null;
当你调用System.out.println((Object)c);
它在内部调用PrintStrem
类的 println 方法。 PrintStream 类中 println 方法的实现如下:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
public void print(Object obj) {
write(String.valueOf(obj));
}
通过这段代码,很明显 out 将调用 String ValueOf
方法。 和 String 类中 ValueOf() 方法的实现如下:-
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
2.String 类重写了对象类的 toString 方法如下:-
/**
* This object (which is already a string!) is itself returned.
*
* @return the string itself.
*/
public String toString() {
return this;
}
对象类中的toString()
方法:-
/**
* Returns a string representation of the object. In general, the
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
您的类Customer
没有覆盖 Object 类的toString()
方法,因此当您调用System.out.println(c);
它将调用Object
类的 toString 方法。 就是这样,您将获得Customer@60e53b93
作为输出。
System.out
是类PrintStream
的对象。 并且PrintStream.println()
String.valueOf()
为对象调用String.valueOf()
。 而String.ValueOf(object)
调用 object.toString()。 对于 String, PrintStream.println()
打印出该字符串。 至于 Customer 类,您默认使用Object.toString()
导致打印 Customer@ 字符串。
注意: println()
是System
类中的重载方法。 当你打电话
Customer c = new Customer("Sally");
System.out.println(c);
这将调用将对象作为参数的println()
方法。 如果您参考文档,您将看到:
public void println(Object x)
打印一个
Object
,然后终止该行。 此方法首先调用String.valueOf(x)
以获取打印对象的字符串值,然后其行为就像调用print(String)
和println()
。参数: x - 要打印的对象。
当您调用println(c.name)
, name
是一个String
变量,这将调用以String
作为参数的println()
方法:
System.out.println(c.name);
在文档中:
打印
public void println(String x)
打印一个
String
,然后终止该行。 这个方法的行为就像它先调用print(String)
然后调用println()
。参数: x - 要打印的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.