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);
}
}
请参阅上面的代码和此处的图片Passing Value
问题:
System.out.println(c);
,IDE将为我生成一个内存地址:Customer@60e53b93
,该对象有一个成员变量,它是一个引用到一个String - > " Sally",为什么当我System.out.println(c.name)
尝试打印参考(名称)时,它会给出真正的字符串对象 t ("莎莉")。 不应该打印真实对象的内存地址(" Sally")???
答案 0 :(得分:4)
第一个问题答案: -
1。out
是System Class中PrintStream的静态变量。
在System类中声明为
public final static PrintStream out = null;
当你致电System.out.println((Object)c);
时
在内部调用PrintStrem
类的println方法。
PrintStream类中println mehtod的实现如下: -
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 Class中实现ValueOf()方法,如下所示: -
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
2.String类覆盖了Object Class的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
Class的toString方法。多数民众赞成你将获得Customer@60e53b93
作为输出。
答案 1 :(得分:2)
System.out
是类PrintStream
的对象。 PrintStream.println()
为对象调用String.valueOf()
。 String.ValueOf(object)
调用object.toString()。
对于String,PrintStream.println()
打印出字符串。对于Customer类,您默认为Object.toString()
导致打印Customer @ string。
答案 2 :(得分:1)
注意:println()
是System
类中的重载方法。当你打电话
Customer c = new Customer("Sally");
System.out.println(c);
这将调用将对象作为参数的println()
方法。如果你参考documentation,你会看到:
public void println(Object x)
打印
Object
然后终止该行。这个方法调用 首先获取打印对象的字符串值String.valueOf(x)
,然后 表现得好像它会调用print(String)
然后调用println()
。<强>参数:强> x - 要打印的对象。
当您致电println(c.name)
时,name
是String
变量,这将调用以println()
为参数的String
方法:
System.out.println(c.name);
<强>的println 强>
public void println(String x)
打印
String
,然后终止该行。此方法表现为 虽然它会调用print(String)
然后调用println()
。参数: x - 要打印的字符串。