Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java out-in-System.out.println()_Java_Jvm_System - Fatal编程技术网

Java out-in-System.out.println()

Java out-in-System.out.println(),java,jvm,system,Java,Jvm,System,首先,如果这是一个非常基本的问题,我会感到遗憾,我认为我仍然是一个代码猴子。 在一次采访中,我被要求解释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.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中,out对象在哪里实例化?如果我没有错的话,它是一个预定义的对象吗。对此,应该有什么细致的解释?


从技术上讲,我们应该叫什么?out是PrintStream类型的变量,还是应该说它是PrintStream类型的对象?

System.out由JVM提供。在调用main方法时,System.out已打开并准备好使用


请参见

系统。out
是一个正常的静态属性,由JVM在JVM初始化期间通过
initializeSystemClass()
方法设置。您甚至可以通过调用
System.setOut(printOutStream)来更改它(尽管不推荐)
,其中
printOutStream
是要用作标准输出的流

这里详细介绍了System.out.println()的工作原理。

System.out.println()


这里println是printstream类的对象。我们不能直接为printstream类创建对象。Out是系统类的对象。out在系统类中称为字段。在调用system.out时,它间接地为printstream类创建对象。因此,我们可以使用System.out.prontln()调用println()方法。

在Oracle Java运行库中,它是使用
registerNatives()
本机方法进行本机实例化的,在加载
系统
类时(通过
静态
初始值设定项)调用本机方法。然而,这是一个实现细节


您还可以直接使用
System.setOut()

设置
System.out
,在实例化类时,System.out初始化为
null
。这是由
System.java
中的
nullPrintStream()
方法设置的,该方法只返回
null

JVM初始化后,将调用
initializeSystemClass()
方法。此方法调用
native
方法
setOut0()
,该方法将
out
变量设置为适当的值

这可能看起来很奇怪,但出于以下原因,这是一项必要的操作:

  • out
    不能静态设置为该值,因为
    System
    需要是第一个加载的类之一(在
    PrintStream
    之前)
  • out
    必须是
    final
    ,以便用户不能直接覆盖其值
  • 由于
    out
    不能静态设置,并且是最终设置,因此我们必须使用
    native
    方法
    setOut0()
    覆盖语言的语义

我希望这有助于您的理解。

Out in System.Out.pritln是系统类中PrintWriter的静态字段(对象),println是PrintWriter的方法

参考: 系统:
PrintWriter:

甚至不需要使用网络和文档。我们可以简单地说javap java.lang.System,它提供了属于系统类的所有静态字段、方法原型的列表。 我们可以使用javap获得任何java类的详细信息,前提是您知道它的包和类名
out是在系统类中定义的PrintStream的公共静态对象。

当系统类初始化时,它调用其
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
是final,这意味着它不能在initializeSystemClass()中设置为其他变量,但使用本机代码可以修改final变量。

你说的“System.out正在返回null”是什么意思?我创建了一个类似于类a{static B out}的模拟程序;类{}我试图打印System.out.println(A.out);返回null。这个答案中有很多错误陈述,几乎太多了,无法计数。Ignore.Surendar,println()不是一个对象,而是PrintStream类的一个方法。您可以直接为PrintStream类创建一个对象。例如,“out”并不是系统的特定对象,但正如您所说,它是系统的一个字段。没有“调用”,但它“是”,因为对象在Java中不只是“有”对象,所以它的结构更为结构化;当JVM启动并将其引用分配给System.out时,它实际上存在。(正如上面其他一些帖子所提到的)实际上
out
是由JVM通过
initializeSystemClass()
方法设置的。这是真的吗?因为
registerNatives()
将本机方法链接到JVM内部方法,所以我从未见过它用于实例化变量。