通过引用变量调用方法

时间:2017-04-19 05:06:13

标签: 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 calc;
}

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

Tasker.calc不是Calc的类似实例吗? System.out如何不是NullPointerException?

要清楚,这不是关于NullPointerException的问题......这是一个关于为什么System.out不需要初始化的问题。

非常感谢!

3 个答案:

答案 0 :(得分:2)

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

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

请注意,System.out不是PrintStream的实例 - 它是PrintStream实例的参考。

答案 1 :(得分:1)

您尚未_initialized calc。你可以写了

static Calc calc = new Calc();

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

答案 2 :(得分:0)

正如@LouisWasserman所指出的,你的代码给出NPE的原因是你没有初始化calc变量。因此,它会默认初始化null。解决方案:初始化它!

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

  • 您无需初始化System.out,因为系统会执行此操作。 javadocs这样说。
  • 您无法以正常方式初始化它,因为System.out被声明为final。 (但有System.setOut(...)
  • 即使使用System.setOut(...),应用程序也无法找出<{1}} 应设置为的内容。 (考虑这个System.out