通过引用变量调用方法
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
)
我正在尝试了解 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
)