概述
在java中,包(package),相当于文件夹。包里通常存放的是类文件,因为我们在编写程序的时候,难免会有类名相同的情况。为了对类进行分类管理,java提出了包机制解决方案,在不同包中可以有相同的类名,调用的时候连同包名一起就行。
目的
对于多个类为了便于管理(类同名情况)而提出的解决方案。
作用
- 避免多个类重名的情况,如果出现两个相同名字的类,可通过包将两者区分,从而避免冲突。
- 对类文件进行管理
- 给类文件提供了名称空间。
- 包的出现可以将java的类文件和源文件相分离。
- 在调用其他包中的类时,需要写类的全称,也就是连同包名一起书写。当类存在多层包中时,使用import导入后,使用其类时,就可以不加包名了。 一个程序文件中只有一个package,可以有多个import。import导入的是包中的类或静态成员。
规则
- 包必须写在程序的第一行,并且包名为全小写字母组成。因为要先有包,才知道class文件的存放地方。
- 类的全称:包名.类名。
- 编译定义了包的程序文件时,在编译时要指定包的存储目录。
如:javac –d D:\CLASSPATH 类名.java
类间的访问权限
- 要访问其他包中的类,需要定义类的全称:包名.类名。
- 如果class文件目录不在当前路径,需要使用classpath设定环境变量,为JVM指明路径。
- 被访问的包中的其他类权限必须是public。
- 异包之间访问只能有两种权限可用:public和protected。protected是为其他包中的子类提供的一种权限。不同包中的子类可以直接访问父类中被protected权限修饰的成员。
- 公有类只能访问其他包中的公有类或公有成员。
| public | protected | default(friendly) | private |
同类中 | √ | √ | √ | √ |
同包中 | √ | √ | √ | |
异包子类中 | √ | √ | | |
异包中 | √ | | | |
关键字
- package:定义包。如:
package bean; - import:导入,可以导入类,也可以导入静态成员(Java5支持),可以使用通配符*。如:
import java.util.TreeSet;
import java.util.*;
import static java.lang.Math.max;
import static java.lang.Math.*;
注意事项
- 在导入包时,如果包中有很多类,可以使用通配符*,但是,不建议这么做。
- import中使用通配符*,不会导入子包中的类。
- 定义包名不要重复,可以使用url来完成定义,url是唯一的。
- 导入的不同包中有相同类时,必须写类的全名以区分。
jar包
概述
class文件太多时,可以使用java中用jar工具来对包进行打包压缩,扩展名为jar。
使用
jar.exe工具的使用
创建jar包
jar -cvf mypack.jar packa packb
查看jar包
jar -tvf mypack.jar [>定向文件]
解压缩
jar -xvf mypack.jar
自定义jar包的清单文件
jar –cvfm mypack.jar mf.txt packa packb
jar包的作用
- 可以将多个包进行压缩到为一个文件,方便项目的携带。
- 方便于使用,只要在classpath设置jar路径,即可以执行jar包中的java程序。
- 数据库驱动,SSH框架等都是以jar包体现的。
示例
PackFather.java
package packfather;
public class PackFather {
protected void funcFather() {
System.out.println( "Father run!");
PackSon.java
package packson;
public class PackSon extends packfather.PackFather {
public void funcSon() {
funcFather();
System.out.println( "Son run!");
ackageDemo.java
package mypack; // 包名全小写
import packson.PackSon; // import packson.*;
class PackageDemo {
ublic static void main(String[] args) {
/* packson. */ PackSon s = new /* packson. */PackSon();
s.funcSon();
System.out.println( "------------------------------" );
packfather.PackFather f = new packfather.PackFather();
f.funcFather(); //错误,PackFather中funcFather方法被protected修饰,只能在子类中访问。
System.out.println( "Over!");
}
}