通过引用变量调用方法

invoking method via reference variable

我正在尝试了解 System.out 如何调用 println()。所有搜索都说 System.out 是 PrintStream class 的实例,因此它可以调用 class.

中的方法

但是...

当我尝试使用以下 NullPointerException 结果复制它时。

public class Main {
    public static void main(String[] args){
        Tasker.calc.add(1, 2);
    }
}

class Tasker{
    static Calc calc;
}

class Calc {
    public void add(int x, int y){
        System.out.println(x+y);
    }
}

Tasker.calc 不是一个类似的 Calc 实例吗? System.out 为什么不是 NullPointerException?

明确地说,这不是关于 NullPointerException 的问题...这是关于为什么 System.out 不需要初始化的问题。

非常感谢!

您还没有_初始化calc。你可以

static Calc calc = new Calc();

它会起作用(取决于 Calc 的定义)。

为什么 System.out 不需要初始化?嗯...

System class 的深处,有一个 JVM 调用的名为 initializeSystemClass 的方法。它将 System.out 设置为正确的值,因此您不必这样做。

请注意 System.out 不是 PrintStream 的实例 - 它是对 PrintStream.

实例的引用

正如@LouisWasserman 指出的那样,您的代码给出 NPE 的原因是您尚未初始化 calc 变量。结果,它得到默认初始化null。解决办法:初始化吧!

但更深层次的问题是为什么System.out不需要初始化。这是因为 Java 运行时在后台将其初始化为指向引用应用程序(外部)标准输出的 PrintStream。

  • 您不需要初始化 System.out 因为系统会自动完成。 javadocs 这么说。
  • 您无法以正常方式初始化它,因为 System.out 被声明为 final。 (不过还有System.setOut(...))
  • 即使使用 System.setOut(...),应用程序也无法找出 System.out 应该 设置的内容。 (考虑这个 java Test | wc