繁体   English   中英

在System.out.println()中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM