为什么我可以将 class 设置为 null,然后仍然从中调用方法?

Why can I set the class to null and still call methods from it afterwards?

我在 Java 中创建了以下示例代码:

public class SetClassNullExperiment {

    public static void main(String[] args) {
        SetMeNull c1 = new SetMeNull();
        c1.setInputToNull(c1);
        System.out.println("Is c1 equal to null? " + Boolean.toString(c1 == null)); // false
        c1.printHelloWorld();

        SetMeNull c2 = new SetMeNull();
        c2 = null;
        System.out.println("Is c2 equal to null? " + Boolean.toString(c2 == null)); // true
        c2.printHelloWorld(); // Throws a NullPointerException (For obvious reasons...)
    }

}

class SetMeNull {

    /**
     * Set the input class equal to <code>null</code>.
     */
    public void setInputToNull(SetMeNull c) {
        c = null;
    }

    public void printHelloWorld() {
        System.out.println("Hello World!");
    }

}

为什么在调用 c1.setInputToNull(c1) 之后还能调用 c1.printHelloWorld()?我希望在调用 c1.printHelloWorld() 时出现 NullPointerException。为什么不是这样呢?在我看来,前四行(c1)等于最后四行(c2),但只有在最后四行才会抛出一个NullPointerException

这两个例子不一样。首先,您要设置对 null 的引用的副本(参见 this)。如果您要在 setInputToNull 内调用 c 上的方法,您会在那里得到 NPE。