我知道在打印对象时,java在内部调用toString()方法。
但是在重写toString()方法之后,Java没有为空引用调用重写的toString()方法。 请参阅以下代码以供参考,
public class Sample1 {
public static void main (String args[]) {
Test test1 = null;
Test test2 = new Test();
System.out.println(test1);
System.out.println(test2);
}
}
class Test {
@Override
public String toString() {
return "test";
}
}
以上程序的输出为
null
test
任何人都可以解释为什么不为空引用调用重写的toString()方法。
答案 0 :(得分:3)
toString
是属于您的课程的实例的一种方法。但是您的test1
变量没有指向任何地方。它仍然指向null
,而不是Test
类的任何实际实例。
使用toString
不可能使用test1
,因为该变量不会引用具有此方法的任何实例。
让我说明一下变量与实际实例之间的相关性。而且这些方法实际上属于实例,而不属于变量。
test1 ----> null
test2 ----> instance of Test (created by new Test())
|---> toString()
|---> hashCode()
|---> ... // all methods belonging to a Test instance
println
System.out.println
会打印出null
,因为它检测到变量没有指向任何位置,并退回到默认的"null"
作为文本打印。类似于:
void println(Object obj) {
if (obj == null) {
println("null");
} else {
println(obj.toString());
}
}
如果您好奇,可以查找实际代码:
String.valueOf(x)
return (obj == null) ? "null" : obj.toString();
答案 1 :(得分:1)
您不能在引用为空的对象上调用任何方法,否则将抛出NPE。
System.out.println
隐式使用String.valueOf()
方法,该方法返回null
文字作为空引用。
答案 2 :(得分:0)
没有类型,其中“ null”是“ instanceof”。实际上,您可以简单地假装它是“仅仅是可以用于任何引用类型的特殊文字”。因此,两个都设置为null的不同类型的对象将是等效的。
答案 3 :(得分:0)
基本上在java.lang.String.java
class
中,我们也有一种方法,
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
System.out.println(...) -> String.valueOf(x);