为什么在打印空引用时未调用重写的toString

时间:2019-03-16 03:28:26

标签: java oop

我知道在打印对象时,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()方法。

4 个答案:

答案 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());
    }
}

如果您好奇,可以查找实际代码:

  1. PrintStream#println(Object),呼叫String.valueOf(x)
  2. String#valueOf(Object)魔术

    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);

隐式调用此方法