1. 包机制的基本介绍
最开始提到过,一个文件中只能出现一个public类,并且建议一个文件写一个类。那么一个项目肯定会涉及到很多类,并且不同的类有着不同的紧密联系,这些类该怎么管理呢?
和电脑中的文件夹一样,比如有很多个电影,属于不同类型,有恐怖片、喜剧片、爱情片等等。为了更方便的查找影片,就会建立不同的文件夹,将这些电影归档到不同的文件夹里面。同理,在Java中,为了方便管理不同的代码文件,需要将其归档到不同的文件夹中,这个文件夹就叫做package。
package也被称为包机制,其作用就是为了方便程序的管理,不同功能的类存放在不同的包下,即不同的包具有不同的功能。
2. package关键字
package关键字的语法如下:
1 | package 包名; |
注意,package关键字只能出现Java程序的第一行。包名一般采用公司域名倒序的方式,因为公司域名具有全球唯一性。包名也可看作是文件夹的层级关系。
包名:公司域名倒序+项目名+模块名+功能名
注意,带有package关键字的Java程序编译和运行怎么办?
带有package关键字的java程序按照以前的运行方法运行失败,提示
找不到或无法加载主类。因为关键字指明了本文件的所在目录是package,比如package cn.com.sina.www.javatest;,则指明该文件HelloWorld.java所在的目录是cn/com/sina/www/javatest/,也就是最终的类名是cn/com/sina/www/javatest/HelloWorld。而我们用原始的命令行方法编译的时候,仅仅是生成class文件,不会生成具体的目录,所以如果是用命令行编译的话,就需要手动创建目录,将class文件移动到包目录下,编译的之后指定具体的路径即可。**但是这样做,太复杂,可以
javac -d . HelloWorld.java**,-d就是带目录编译,.表示在当前目录。这样就会自动生成了包目录。
编译:javac -d . HelloWorld.java
运行:java cn.com.sina.www.javatest.HelloWorld(注意,不能切换到底层目录,再`java HelloWorld`编译,这样做不对,类名就是这个完整的包名加类名)
除此之外,可以直接使用IDE,它们自带了这种功能,可以直接建立包package。
3. import关键字
在有了package关键字之后,可以看到完整的类名就是加上了包名。所以如果再一个类文件中创建另一个类对象,此时需要完整的类名。但是如果两个类在同一个包下,可以仍然像之前那样做。
1 | package cn.com.sina.www.javatest; |
1 | package cn.com.sina.www.javatest; |
1 | package cn.com.sina.www.javatest02; |
但是,这样做太复杂了,不可能在引用其他包中的类时,要把包名写全。所以就需要关键字import了。即将需要的类导入到本包中,这样在创建类的时候,就不需要写包名了。
import语句用来完成导入其他类,同一个包下的类不需要导入,不在同个包下需要手动导入。import语句需要编写到package语句之下,class语句之上。
import什么时候用?
A类中使用B类。
A类和B类都在同一个包下,不需要import。
A类和B类不在同一个包下,需要使用import。
注意,java.lang是Java语言的核心类,其中的类是系统自动导入的,不用手动导入。比如String就是lang中的一个类,不需要手动导入。
import怎么用?
import语句只能出现在package语句之下,class声明语句之上。
除了下面的用法,也可以
import cn.ac.ucas.javatest.*,即将javatest中的所有类都导入过来。注意,*只能表示类,不能import cn.ac.*,或者说不能导入包,只能导入class类。
导入语法格式:
- import 类名; 注意,这里的类名指的是包含包名的完整路径
- import 包名.*;
1 | package cn.com.sina.www.javatest02; |
4. 简单案例
主要是用import测试权限修饰符,类之间的关系如下所示:

其中CuteCat继承了Cat类,TinyCat仅仅和Cat属于同一个包
1 | package animal; |
1 | package animal; |
1 | package animal; |
1 | package person; |
5. 备注
参考B站《动力节点》。