包
在 Java 中,我们使用package
来解决名字冲突。
在 Java 虚拟机执行的时候,JVM 只看完整类名,因此,只要包名不同,类就不同。
要特别注意:包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
没有定义包名的class
,它使用的是默认包,非常容易引起名字冲突,因此,不推荐不写包名的做法。
包结构
需要按照包结构把 Java 文件组织起来。假设以package_sample
作为根目录,src
作为源码目录,那么所有文件结构就是:
编译后的.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
...
最后更新于