我在某处阅读,在阅读System.out.print
课程中的System
时,有一个声明' out'作为PrintStream
类类型的静态变量,如下所示:public static final PrintStream out;
这引发了一个问题,如果我们只是声明某个类类型的变量而不是通过不调用任何构造函数来初始化它会发生什么?在上面的示例中' out'被宣布为静态和最终的,但我正在寻找一个普遍的答案。
答案 0 :(得分:4)
这引发了一个问题,如果我们只是声明某个类类型的变量而不是通过不调用任何构造函数来初始化它会发生什么?
然后像任何其他字段一样,它以其默认值开始 - 对于引用类型(类,接口,枚举),它是byte
引用。来自section 4.12.5 of the JLS:
程序中的每个变量在使用其值之前必须具有值:
- 每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10.2):
- 对于类型
(byte)0
,默认值为零,即short
的值。- 对于类型
(short)0
,默认值为零,即int
的值。- 对于类型
0
,默认值为零,即long
。- 对于类型
0L
,默认值为零,即float
。- 对于类型
0.0f
,默认值为正零,即double
。- 对于类型
0.0d
,默认值为正零,即char
。- 对于类型
'\u0000'
,默认值为空字符,即boolean
。- 对于类型
false
,默认值为null
。- 对于所有参考类型(§4.3),默认值为
System.out
。
System.setOut
有点特别 - 它是最终的,但可以通过{{1}}进行更改。我会尽量避免基于此推断任何其他行为。
答案 1 :(得分:0)
创建对象并将其存储在变量中时,实际上并不存储它。您只能获得指向对象当前所在位置的特定内存地址的指针。
如果不初始化对象,则会得到一个空指针。该对象根本不存在,其中没有字段或方法。
静态字段和方法不同,它们没有连接到对象的实例,它们连接到类(这是使用静态的许多原因之一是一种不好的做法)。它们可以随时随地加入。