为什么系统类不需要实例化?

时间:2020-07-08 06:34:13

标签: java

首先很抱歉,如果这是一个非常基本的问题,但是有人问我这个问题,而我没有任何答案。

在声明中

    System.out.println()

System是java.lang包中的类,out是System类的静态变量,而println()是重载方法。 那么为什么系统类不需要实例化呢?

谢谢

3 个答案:

答案 0 :(得分:1)

java.lang.*是默认导入的,即java.lang.*包中的所有类都可以被程序访问。因此,您的类可以访问System类的成员,其中包括out(类型为PrintStream的静态字段)。静态成员不绑定到类的实例,因此可以直接访问它们而无需实例化。因此,您可以调用out可用的重载打印方法。

答案 1 :(得分:0)

如果您在Java类中声明了静态方法,则无需创建对象,而只需调用System.out.println()之类的方法即可。

答案 2 :(得分:0)

无论如何都无法实例化System类(参见Javadoc)。

这是通过将构造函数设置为private来实现的:

private System() {
}

但是,例如openj9中的System类通过调用afterClinitInitialization()方法来部分填充,该方法在线程初始化之后被调用。

其中的out变量实际上已初始化:

setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true));

请参阅:

System.afterClinitInitialization()

Thread.initialize()

此后,它不再可以通过Github进行跟踪,但是我想您明白了。初始化仅由JVM完成,并且由于out是静态的,因此不需要System的实例即可访问变量。

不过,静态变量的主题涵盖了很多:

What does the 'static' keyword do in a class?

Static (Keyword) - Wikipedia.com

要完全理解这一点,您必须对JVM和本机编程有相当的了解,而我必须投降自己。