首先很抱歉,如果这是一个非常基本的问题,但是有人问我这个问题,而我没有任何答案。
在声明中
System.out.println()
System是java.lang
包中的类,out是System类的静态变量,而println()
是重载方法。
那么为什么系统类不需要实例化呢?
谢谢
答案 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()
此后,它不再可以通过Github进行跟踪,但是我想您明白了。初始化仅由JVM完成,并且由于out
是静态的,因此不需要System
的实例即可访问变量。
不过,静态变量的主题涵盖了很多:
What does the 'static' keyword do in a class?
Static (Keyword) - Wikipedia.com
要完全理解这一点,您必须对JVM和本机编程有相当的了解,而我必须投降自己。