Java 通过引用变量调用方法
我试图理解System.out如何调用println()。所有搜索都表示System.out是PrintStream类的实例,因此它可以调用该类中的方法 但是 当我尝试用下面的NullPointerException结果复制它时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
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
calc
变量。因此,它的值为null
。(相比之下,Java运行时会自动将System.out
初始化为非空值。)我也在想应该做些什么来关闭它。。。什么是Nullpointerexception?有人想过吗?因为系统会处理这个问题。它很特别。(此外,您无法正确初始化它。该变量被设置为指向JVM的标准输出流,并且无法找到它应该是什么…)提示:阅读javadocs!为什么我不回答这个或任何问题?