[英]out in System.out.println()
首先感到遗憾的是,如果这是一个非常基本的问题,我建议我仍然是代码猴子。 我在一次采访中被要求阐明System.out.println(); 我解释了以下方式
//this class belongs to java.lang package
class System{
public static PrintStream out;
}
//this class belongs to java.io package
class PrintStream{
public void println..
}
我已经解释说System.out是有效的,因为这是我们在java中访问静态变量的方式,而out是PrintStream的对象,因此我们可以访问其方法,总之为
System.out.pritnln();
他要求我模拟类似的程序,但我跟踪了它,但是它没有用,因为System.out返回null
我的问题是在Java中实例化的对象在哪里? 如果我没看错,它是预定义的对象吗? 为此应该进行细致的解释。
从技术上讲,我们应该喊什么? 是类型为PrintStream的变量还是应该说它为类型为PrintStream的对象?
实例化类时,System.out初始化为null
。 这是由设置nullPrintStream()
在方法System.java
,这只是返回null
。
JVM初始化后,将调用initializeSystemClass()
方法。 此方法调用本native
方法setOut0()
,该方法将out
变量设置为适当的值。
这看起来很奇怪,但是由于以下原因,它是必需的操作:
out
不能静态设置为该值,因为System
需要是第一个加载的类之一(在PrintStream
之前)。 out
必须是final
以便用户不能直接覆盖其值。 out
不能静态设置,并且是最终的,因此我们必须使用native
方法setOut0()
覆盖语言的语义。 希望对您有所帮助。
System.out
是正常的静态属性,它是JVM在JVM初始化期间通过initializeSystemClass()
方法设置的。 您甚至可以通过简单地调用System.setOut(printOutStream);
来更改它(尽管不建议这样做System.setOut(printOutStream);
,其中printOutStream
是要用作标准输出的流。
这是一篇很好的文章,详细介绍了System.out.println()的工作方式。
System.out.pritln中的Out是System类中PrintWriter的静态字段(对象),而println是PrintWriter的方法。
参考:系统: http : //docs.oracle.com/javase/6/docs/api/java/lang/System.html PrintWriter: http : //docs.oracle.com/javase/6/docs/api/java /io/PrintWriter.html
甚至不需要网络和文档。 我们可以简单地说javap java.lang.System,它为您提供了所有静态字段的列表,这些列表属于System类。 我们可以使用javap获取任何java类的详细信息,只要您知道它的包和类名是System类中定义的PrintStream的公共静态对象即可。
初始化System类时,它将调用其initializeSystemClass()
方法,下面是代码:
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
在此代码中, setOut0()
是在System.c中实现的本机函数:
JNIEXPORT void JNICALL
Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
{
jfieldID fid =
(*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
if (fid == 0)
return;
(*env)->SetStaticObjectField(env,cla,fid,stream);
}
这是一个标准的JNI代码,将System.out设置为传递给它的参数,该方法调用本地方法setOut0(),该方法将out变量设置为适当的值。
System.out
是最终的,这意味着无法在initializeSystemClass()中将其设置为其他值,但是使用本机代码可以修改最终变量。
System.out由JVM提供。 在您的主要方法被调用时,System.out已打开并可以使用。
参见http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#out
在Oracle Java运行时库中,它是使用registerNatives()
本机方法本地化的,该方法在加载System
类时被调用(通过static
初始化程序)。 但是,这是一个实现细节。
您也可以直接使用System.setOut()
设置System.out
。
的System.out.println();
这里的println是printstream类的对象。我们不能直接为printstream类创建对象。 Out是系统类的对象。 out在系统类中称为字段。 在调用system.out时,它间接为printstream类创建对象。 因此我们可以使用System.out.prontln()调用println()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.