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

时间:2018-05-23 12:07:49

标签: java java-io

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

由于Systemjava.lang的一类,我可以使用字段System.out。但是此字段的类型为java.io.PrintStream,默认情况下不会导入此类(它位于java.io包中),那么为什么我可以访问System.out.print()而不单独导入java.io.PrintStream

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

提前致谢。

2 个答案:

答案 0 :(得分:5)

如果您需要在 代码中使用 Pattern p = Pattern.compile("(http|https|ftp|mailto|file|data|irc|rtsp)(\\:)(^\\w{1})([a-zA-Z0-9/%+.-]*$)\\.(com|net|org|jo)\\/(.+)" , Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(text); if(m.matches()) System.out.println(text) ; else System.out.println("no matches"); (班级名称),则只需导入PrintStream。使用PrintStream类型的另一个对象上的字段并不需要它。

也就是说,PrintStream是告诉编译器代码中import(文字文本)的含义。不要告诉编译器您将使用从其他地方获取的PrintStream对象(在本例中为PrintStream)。

换句话说:System是关于知道如何编译源文本的;它与运行时使用的内容无关。例如,导入不会写入类文件;在运行时不需要这些信息。字段和变量定义以其完全限定的类名存储,而不是import - 相对的。由于import中的out类型信息表明它是System,因此编译器(以及后来的JVM)知道它{sa {{1}无论您是否在代码中导入java.io.PrintStream

答案 1 :(得分:0)

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的类数据中找到具有Y等方法的类Y.