Java 通过引用变量调用方法

Java 通过引用变量调用方法,java,methods,instance,system.out,Java,Methods,Instance,System.out,我试图理解System.out如何调用println()。所有搜索都表示System.out是PrintStream类的实例,因此它可以调用该类中的方法 但是 当我尝试用下面的NullPointerException结果复制它时 public class Main { public static void main(String[] args){ Tasker.calc.add(1, 2); } } class Tasker{ static Calc c

我试图理解System.out如何调用println()。所有搜索都表示System.out是PrintStream类的实例,因此它可以调用该类中的方法

但是

当我尝试用下面的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
不需要初始化?嗯

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


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

实例的引用,正如@LouisWasserman指出的,您的代码给出NPE的原因是您尚未初始化
calc
变量。因此,它将默认初始化为
null
。解决方案:初始化它

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

  • 您不需要初始化
    System.out
    ,因为系统会这样做。政府是这么说的
  • 您无法以正常方式初始化它,因为
    System.out
    被声明为
    final
    。(但有
    系统设置(…)
  • 即使使用
    System.out(…)
    应用程序也无法确定
    System.out
    应设置为什么。(考虑这个
    java测试| wc

您从未初始化过Tasker.calc,因此您将获得此异常。在开始之前,您可能需要阅读一本好的Java教程,Oracle的跟踪是一个好的开始。您尚未初始化CalcyYou尚未初始化
calc
变量。因此,它的值为
null
。(相比之下,Java运行时会自动将
System.out
初始化为非空值。)我也在想应该做些什么来关闭它。。。什么是Nullpointerexception?有人想过吗?因为系统会处理这个问题。它很特别。(此外,您无法正确初始化它。该变量被设置为指向JVM的标准输出流,并且无法找到它应该是什么…)提示:阅读javadocs!为什么我不回答这个或任何问题?