为什么 System.out.println() 中不需要 java.io.PrintStream?
why java.io.PrintStream is not needed in System.out.println()?
所以我问自己为什么我不必导入 java.io.PrintStream
来使用 System.out
。我知道 java.lang
是编译器默认导入的。好的。
因为 System
是 java.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
相对名称。由于 System
中 out
的类型信息表明它是 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 等方法。
所以我问自己为什么我不必导入 java.io.PrintStream
来使用 System.out
。我知道 java.lang
是编译器默认导入的。好的。
因为 System
是 java.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
相对名称。由于 System
中 out
的类型信息表明它是 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 等方法。