这不是一个对象
你的推理出了问题。System.out
是(对)一个对象的引用。
引用的类型是 PrintStream
,如Javadoc中所述。这意味着您可以在 System.out
上调用 PrintStream
的方法,例如:
System.out.println();
out
不是调用一个方法: out
是一个变量,保存着一个对象(PrintStream
的实例),你可以在这个对象上调用一个方法。
例如:
System.out.println("hey!");
你也可以这样做
void print(PrintStream ps, Object o) {
ps.println(o);
}
...
print(System.out, "hey!");
Out是System类的一个公共静态字段。
由于它是公共的,您可以在其上调用方法。
它的类型是PrintStream。
学习的最佳方式是阅读文档:
请注意顶部描述“in”、“out”和“err”的部分。PrintStream
类型对象的引用,因此,您可以在其上调用方法。大致上可以将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()的。
实际上,在System.out.println(String args[])
中的输出参数是System
类中的静态字段。每当声明一个字段时,它都应该有特定的数据类型。在这个类中,out字段被定义为static PrintStream out;
。
这意味着out的数据类型是PrintStream
类。通过这种方式,System.out
实际上代表了PrintStream
类的一个对象。使用这个对象,我们调用PrintStream
类的println()
方法。
System是一个final类,它有一个final变量out,其中保存了PrintStream类的一个对象,我们可以在该对象上调用println()方法。
System.out是PrintStream的一个特定实例,其输出链接到类似于C++ stdout的等效物
int
等)根据“对象”的大多数定义(包括所有有用的定义,我认为)都不是对象。而变量(引用类型的变量)引用对象,它们本身并不是对象。 - user395760