在Java中,如何使用System.out引用PrintStream类?

4
我是一名初学者,正在学习Java并且有一些C++的知识。现在System.out.println();这段代码让我感到困惑。所以System是一个类,out是一个变量,可以调用方法?根据http://journals.ecs.soton.ac.uk/java/tutorial/getStarted/application/objects.html,out是一个类变量,变量是计算机内存中具有类型名称和内容的存储位置。它不像字符串一样是一个对象,可以使用像.getLength()这样的方法。网站解释的方式是out指代PrintStream类的一个实例,但是如何做到的呢?

每个变量在某种意义上都是一个“对象”。编辑:按照您的定义 - 能够调用它们的方法 - 这对于每个变量都是正确的(尽管严格来说,并非所有变量都是对象,如@delnan所指出的那样)。 - mellamokb
2
@mellamokb 原始类型(如 int 等)根据“对象”的大多数定义(包括所有有用的定义,我认为)都不是对象。而变量(引用类型的变量)引用对象,它们本身并不是对象。 - user395760
@mellamokb 这让我感到困惑... - Freeman Lou
8个回答

6

这不是一个对象

你的推理出了问题。System.out 是(对)一个对象的引用。

引用的类型是 PrintStream,如Javadoc中所述。这意味着您可以在 System.out 上调用 PrintStream 的方法,例如:

System.out.println();

1

out 不是调用一个方法: out 是一个变量,保存着一个对象(PrintStream 的实例),你可以在这个对象上调用一个方法。

例如:

System.out.println("hey!");

你也可以这样做

void print(PrintStream ps, Object o) {
    ps.println(o);
}
...
print(System.out, "hey!");

1

1
更严格地说,它是一个公共静态字段,它是指向PrintStream类型对象的引用,因此,您可以在其上调用方法。
Java引用大致类似于C指针(至少在使用方式上如此,显然存在重大差异)。

0

大致上可以将System类看作是这样的:

package java.lang;
public final class System {

    public final static PrintStream out;
}

这里的out是一个"Printstream"类型的静态final变量。 由于它是一个静态变量,我们可以通过"ClassName.variableName"来调用它,而不需要创建任何System类的对象,所以我们使用System.out。

现在,out是"PrintStream"类的引用变量。到目前为止,只创建了这个引用变量,并且它没有引用任何Printstream类的"对象"。 但是当System类被加载到内存中时,它会创建PrintStream的对象。 为此,请参见下面链接中System类的完整源代码中的initializeSystemClass()setOut0()方法。(不要被这个庞大的代码所吓倒,只需确信在System(这里在第1095行)中调用了"new PrintStream()")。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/System.java

所以,当我们有一个PrintStream类的对象时,我们的out引用变量可以轻松地调用它的方法,对吧?这就是我们如何调用System.out.println()的。


0

实际上,在System.out.println(String args[])中的输出参数是System类中的静态字段。每当声明一个字段时,它都应该有特定的数据类型。在这个类中,out字段被定义为static PrintStream out;

这意味着out的数据类型是PrintStream类。通过这种方式,System.out实际上代表了PrintStream类的一个对象。使用这个对象,我们调用PrintStream类的println()方法。


0

System是一个final类,它有一个final变量out,其中保存了PrintStream类的一个对象,我们可以在该对象上调用println()方法。


0

System.out是PrintStream的一个特定实例,其输出链接到类似于C++ stdout的等效物


所以它是System的一个变量,但是指向PrintStream System(){ PrintStream out=new PrintStream;} ? - Freeman Lou
"属性"是正确的术语。就像拥有一个类System{static PrintStream out=...;},但它是由Java虚拟机创建和初始化的。 - thedayofcondor
System.out是一个对象,你可以调用它的方法 - 比如print()。 - thedayofcondor
这是一个对象和类变量吗? - Freeman Lou
例如,Person是一个类。new Person("Freeman Lou")是Person的一个实例。lou=new Person("Freeman Lou")是一个变量,它持有对一个实例的引用。 - thedayofcondor
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接