为什么我不必导入一些课程?

时间:2014-05-16 19:37:36

标签: java import

查看此.java文件:

class A {
    HashMap a;
}

它不编译;我需要import java.util.HashMap;。现在考虑一下:

class A {
    String a;
}

它完全相同 - 除了String而不是HashMap - 所以它不应该编译,对吧?错。

好的,众所周知,您不必导入String,但为什么是这样的? “显而易见”的答案是因为String的使用频率远远超过HashMap,但是ArrayList不应该“隐式导入”?原始包装类怎么样,例如IntegerBoolean? <{1}}和ArrayList使用{em>远的次数比Long少,但我必须导入Float而不需要导入ArrayList }}

不需要导入FloatStringIntegerCharacter和其他几个类的原因是什么?

2 个答案:

答案 0 :(得分:6)

  

显而易见的答案是因为String的使用频率远远高于HashMap

没有。 String属于java.lang包,由编译器自动导入。

来自java.lang javadoc:

  

提供对Java编程语言设计至关重要的类。最重要的类是Object,它是类层次结构的根,Class,其实例在运行时表示类。

来自Java Language Specification. Chapter 7. Packages

  

包由许多编译单元(§7.3)组成。编译单元自动访问其包中声明的所有类型,并自动导入预定义包public中声明的所有java.lang类型。

答案 1 :(得分:3)

您不必导入的那些类是java.lang包中的那些类。

JLS, Chapter 7,声明:

  

编译单元自动访问其包中声明的所有类型,并自动导入预定义包java.lang中声明的所有公共类型。

StringIntegerCharacterExceptionBoolean都在java.lang包中。但是,ArrayListHashMap位于java.util包中,如您所知,需要导入(或者可以完全限定)。