包就是一种目录结构,为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
使用包的意义,有以下三点:
1)把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
2)如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免类名冲突。
3)包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。(后面章节做深入探讨)
1.把功能相似的类放在同一个包下
这个道理就好比,你买了一个200平米的大房子,为了生活你又买来了很多生活用品,比如:床,沙发、茶几、餐桌、洗脸盆、马桶、灶台等等,那么这些东西不可能共同摆放在这200平米的大房间里,我们有必要将房间再分割成不同小房间,把功能相似的物品摆放着相同的房间里面,就是我们常说的三室两厅两卫。 创建包时需要注意如下几点: 1)创建包时用package关键字,那么这个类的完整名字就是包名+类名。 2)如果有包声明,包声明一定作为源代码的第一行; 3)包的名称一般为小写,包名要有意义,如果是给某个企业做开发,最好是该企业倒写的域名。例如:家包名可以命名“home”,再如,卧室包可以命名“bedroom”;
下面代码的包结构,就完美表达了一个家里面各个类的组织结构:

2.避免类名冲突
这个道理就好比,每年大学开学,有很多新生入学。出现很多重名重姓的学生,比如:出现了很多名字叫"李鹏"的学生,我们可以按照不同学院,不同专业,不同班级,甚至不同小组来划分不同的"李鹏"。例如: 计算机学院.软件工程.一班.李鹏 电气自动化学院.电子信息.二班.李鹏
这样就有效的解决学生的重名问题。
程序也是一样的道理。例如:我们分别在dome.com和dome.net下都创建了A类。结构图如下:

两个A类的代码如下:
//demo.com.A.java//////////////////////////////////////////////////////////
package demo.com;
public class A {
public A(){
System.out.println("demo.com.A 的构造方法被执行了");
}
}
//demo.net.A.java////////////////////////////////////////////////////////////
package demo.net;
public class A {
A(){
System.out.println("demo.net.A 的构造方法被执行了");
}
public static void main(String[] args) {
A obj1 = new A();
demo.com.A obj2 = new demo.com.A();
}
}
运行结果:
demo.net.A 的构造方法被执行了
demo.com.A 的构造方法被执行了
包就是一种目录结构,使用包的意义在于避免类名冲突、编译组织和管理功能相似的类、包也是一种访问权限。