所以我问自己为什么我不必导入java.io.PrintStream
来使用System.out
。我知道编译器默认导入java.lang
。行。
由于System
是java.lang
的一类,我可以使用字段System.out
。但是此字段的类型为java.io.PrintStream
,默认情况下不会导入此类(它位于java.io包中),那么为什么我可以访问System.out.print()
而不单独导入java.io.PrintStream
?
如果我创建自己的类MyClass
,那么我就不能做这样的事情MyClass anInstance = new MyClass();
首先需要导入MyClass。为什么这不是PrintStream
的强制要求?
提前致谢。
答案 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.