包
在 Java 中,我们使用package来解决名字冲突。
在 Java 虚拟机执行的时候,JVM 只看完整类名,因此,只要包名不同,类就不同。
要特别注意:包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
没有定义包名的class,它使用的是默认包,非常容易引起名字冲突,因此,不推荐不写包名的做法。
包结构
需要按照包结构把 Java 文件组织起来。假设以package_sample作为根目录,src作为源码目录,那么所有文件结构就是:
package_sample
└─ src
├─ hong
│ └─ Person.java
│ ming
│ └─ Person.java
└─ mr
└─ jun
└─ Arrays.javapackage mr.jun; // 申明包名mr.jun
public class Arrays {
}编译后的.class文件也需要按照包结构存放。如果使用 IDE,把编译后的.class文件放到bin目录下,那么,编译的文件结构就是:
在 IDE 中,会自动根据包结构编译所有 Java 源码,所以不必担心使用命令行编译的复杂命令。
寻找Class
Java 编译器最终编译出的.class文件只使用 完整类名,因此,在代码中,当编译器遇到一个class名称时:
如果是完整类名,就直接根据完整类名查找这个
class;如果是简单类名,按下面的顺序依次查找:
查找当前
package是否存在这个class;查找
import的包是否包含这个class;查找
java.lang包是否包含这个class。
例子:
如果有两个class名称相同,例如,mr.jun.Arrays和java.util.Arrays,那么只能import其中一个,另一个必须写完整类名。
包的最佳实践
为了避免名字冲突,我们需要确定唯一的包名。推荐的做法是使用倒置的域名来确保唯一性。例如:
org.apache
org.apache.commons.log
com.tobebetterjavaer.sample
子包就可以根据功能自行命名。
要注意不要和java.lang包的类重名,即自己的类不要使用这些名字:
String
System
Runtime
...
要注意也不要和 JDK 常用类重名:
java.util.List
java.text.Format
java.math.BigInteger
...
最后更新于