![你好!Java](https://wfqqreader-1252317822.image.myqcloud.com/cover/628/50417628/b_50417628.jpg)
2.5.2 包
老师!我在学习Java的包概念时遇到了一些问题。能帮我解释一下Java中的包是什么吗?
当然可以,小东!在Java中,包(Package)是一种用于组织和管理代码的概念。它可以包含一组相关的类型,如类、接口、枚举和注解。通过使用包,我们可以为这些类型提供访问保护和命名空间管理。
我明白了。那么包的作用是什么呢?
包的作用有几个方面。首先,它提供了一种命名空间管理机制。不同的包可以拥有相同名称的类,但由于它们位于不同的包中,它们的完全限定名(包括包名和类名)不会发生冲突。这使得我们能够更好地组织和管理代码,避免命名冲突。
其次,包还提供了访问保护机制。在Java中,类可以有不同的访问修饰符,如public、protected、private或默认(即没有显式修饰符)。通过将类放置在特定的包中,并使用适当的访问修饰符,我们可以控制其他类对于这些类的访问权限。
最后,包还有助于代码的可维护性和可读性。通过将相关的类型组织在同一个包中,我们可以更容易地理解和查找特定类型的代码。这种逻辑上的组织有助于降低代码的混乱程度,并使代码更易于阅读和维护。
1.声明包
Java中使用package语句声明包,package语句应该放在源文件除了注释以外的第一行,在每个源文件中只能有一个包定义语句,并且package语句适用于所有Java类型(类、接口、枚举和注解)的文件。声明包语法格式如下。
![](https://epubservercos.yuewen.com/92BB40/29686251103543406/epubprivate/OEBPS/Images/46_05.jpg?sign=1738843738-zBrSd6ewCUuZmg2pR4wrf5Jc8WiqINun-0-eeeb21c1b75834369cb6abec17bc65a7)
pkg1~pkg3都是组成包名的一部分,之间用点(.)连接。首先,它们的命名应该是合法的标识符;其次应该遵守Java包命名规范,即全部采用小写字母。例如:com.abc是自定义的包名。
声明包的示例代码如下:
![](https://epubservercos.yuewen.com/92BB40/29686251103543406/epubprivate/OEBPS/Images/47_01.jpg?sign=1738843738-z6hUuZRJVSN9Vi5syebsKOXY2e5japUh-0-07a79def88fc11b8379535105d10684d)
从上述代码可见Student.java源文件中声明了com.abc包。
事实上,在HelloProj项目中包含了多个相同名字的类(如:Xyz类),它们应该在不同的包中,如图2-2所示。
![](https://epubservercos.yuewen.com/92BB40/29686251103543406/epubprivate/OEBPS/Images/47_02.jpg?sign=1738843738-a8ZN01wWD2Uga8aXesYg4p7BnUIkpDlw-0-9a83ab4e00250fde1d463076fb56c7f4)
图2-2 不同包中的Xyz类
2.引入包
为了能够使用一个包中的Java类型(类、接口、枚举和注解),需要在Java程序中明确引入该包。使用import语句实现包引入。import语句应位于package语句之后,所有类的定义之前。可以有0~n条import语句。其语法格式为:
![](https://epubservercos.yuewen.com/92BB40/29686251103543406/epubprivate/OEBPS/Images/48_01.jpg?sign=1738843738-AQP4CvtbrRmFqxHALGdvNNzAUpTuHIOe-0-51be01ee0382796986f331153e7eab89)
“包名.Java类型名”表示只引入具体Java类型,“包名.*”表示引入这个包下所有的Java类型(*为通配符)。但从编程规范的角度,提倡明确引入具体Java类型,即采用“包名.Java类型名”的形式,这样可以提高程序的可读性。
示例代码如下:
![](https://epubservercos.yuewen.com/92BB40/29686251103543406/epubprivate/OEBPS/Images/48_02.jpg?sign=1738843738-VUVVIiBDGvtv7o94t4Q4cPTKmWelJSa2-0-4d9f892f4ea2cfe595f78a5d8216caee)
引入包的代码应该放在package语句之后,见代码第①~③处,注意代码第①处使用了通配符(*)引入com.abc包中的所有类型,但这种做法一般不推荐,因为它的可读性不好,而是推荐采用代码第②处的方式引入具体的类型。
另外,需要注意的是,引入的类名也可能会有冲突!例如:Date类在java.util和java.sql包中都有,所以在使用时还可以指定类的全名,见代码第④处的java.sql.Date()。
当前源文件与要使用的Java类型(类、接口、枚举和注解)在同一个包中时,可以不引入包。另外,java.lang包中包含了Java语言的核心类,它不需要显式地使用import语句引入,它是由解释器自动引入的。