为什么 System.out.println() 中不需要 java.io.PrintStream?

why java.io.PrintStream is not needed in System.out.println()?

所以我问自己为什么我不必导入 java.io.PrintStream 来使用 System.out。我知道 java.lang 是编译器默认导入的。好的。

因为 Systemjava.lang 的 class 我可以使用字段 System.out。但是这个字段的类型是 java.io.PrintStream 而这个 class 默认情况下不导入(它在 java.io 包中),那么为什么我可以访问 System.out.print() 例如不导入 java.io.PrintStream 分开 ?

如果我创建自己的 class MyClass 那么我不能做这样的事情 MyClass anInstance = new MyClass(); 需要先导入 MyClass。为什么这对于 PrintStream 不是强制性的?

提前致谢。

如果您需要在 您的 代码中使用 PrintStream(class 名称),则只需导入 PrintStream。在另一个 PrintStream 类型的对象上使用字段不需要它。

import就是告诉编译器PrintStream(字面意思)在你的代码中是什么意思。这并不是告诉编译器您将使用从其他地方获得的 PrintStream 对象(在本例中为 System)。

换句话说:import是知道如何编译源文本;这与运行时使用什么无关。例如,导入不会写入 class 文件;只是在运行时不需要这些信息。字段和变量定义与它们的完全限定 class 名称一起存储,而不是 import 相对名称。由于 Systemout 的类型信息表明它是 java.io.PrintStream,编译器(以及后来的 JVM)知道它是 java.io.PrintStream,无论您导入 PrintStream是否在您的代码中。

X.java

package p;
import q.Y;
public class X { Y y; }

Z.java

import p.X;

... X x = ...;
... x.y ...;

对于 X 的出现,编译器需要导入 X。

对于 x.y,编译器可以在 X 的 class 数据中找到 class Y,因为具有 Y 等方法。