包由许多编译单元组成(第7.3节).编译单元自动访问其包中声明的所有类型,并自动导入预定义包java.lang中声明的所有公共类型.
让我们假设以下代码:
package com.example.p1;
public class MyClass { }
Run Code Online (Sandbox Code Playgroud)
package com.example;
public class MyClass { }
Run Code Online (Sandbox Code Playgroud)
package com.example;
public class String { }
Run Code Online (Sandbox Code Playgroud)
package com.example;
import com.example.p1.*;
public class MainNameClash {
private String s; // No Error, even though ambiguous with java.lang.String!
private MyClass m; // No error, even though ambiguous with com.example.p1.MyClass!
}
Run Code Online (Sandbox Code Playgroud)
如果我MyClass从中com.example移入com.example.p2并导入它import com.example.p2.*,我会到达Error: the type MyClass is ambigious使用它的地方.
似乎包中的类型总是优先于任何其他导入的类型,无论是自动显示java.lang还是显式地使用通配符导入,并且编译器不会发出任何警告或错误.
题:
表格的进口声明:
import packageName.subPackage.*
Run Code Online (Sandbox Code Playgroud)
是Type-Import-on-Demand声明.即,只有在当前编译单元范围内该类型不可用时,才会导入类或其中的任何类型.
仅从该JLS部分的示例7.5.2-1:
声明可能会被一个简单名称为Vector的类型的单一类型导入声明所掩盖; 通过名为Vector的类型并在编译单元所属的包中声明 ; 或任何嵌套的类或接口.
因此,如果您的类String与您的类在同一个包中,那么String在该类中使用将引用您的类,因为java.lang.String不会导入.它只会按需导入,如JLS§6.4.1的示例6.4.1-2所示- 阴影.