1.为什么需要包
默认情况下编译一个.java文件,编译之后该文件中的每个类都会生成一个<类名>.class文件,我们可以直接通过类名找到这个类,比如:
class A
{
public void fun()
{
System.out.println("Hello");
}
}
class TestA
{
public static void main(String[] args)
{
A a1 = new A();
a1.fun();
}
}
编译:
javac TestA.java
编译完成后源文件的目录下生成的类文件如下:
直接使用java <类名>
即可运行该类(前提是该类是主类,有main方法):
为了更好的管理类,Java中提供了包管理方式。
2.包的使用方式
2.1.包的声明
- 必须在文件的第一行使用
package
关键字声明该文件中所有的类所在的包; - 可以使用
.
表示包层(比如packge a.b表示该文件中的类位于包a中的包b中);
比如之前的文件要声明包,在代码开头添加一行代码,声明该文件中的类属于包Test:
package Test; //声明在该文件中的类在包Test中
class A
{
public void fun()
{
System.out.println("Hello");
}
}
class TestA
{
public static void main(String[] args)
{
A a1 = new A();
a1.fun();
}
}
2.2.编译运行含有包层的类
声明之后不可直接使用类名找到该类并运行,要通过<包名>.<类名>
找到该类。
比如
package Test;
再次编译:
javac TestA.java
编译之后生成的类文件还是和之前一样,但是直接访问类会出错:
再使用<包名>.<类名>
访问:
依然会出错,这是为什么呢?
我们虽然在文件中使用package
声明了包,但是因为在编译时没有加入自动生成包层的参数,所以不会自动组织文件,需要手动组织文件。
在源文件目录下新建一个文件夹Test
表示Test
包,然后将生成的.class文件
放到该包的文件中:
然后再次使用<包名>.<类名>访问,成功访问到主类:
上面的步骤需要自己手动名建立文件夹和包层对应,这样的过程过于麻烦,使用Javac编译器编译时,可以直接加入-d .
参数,表示在当前目录下自动建立包层。
javac -d . TestA.java
3.同包和不同包类的相互访问
3.1.访问权限
- 在同一个包中:只有私有的成员不能被访问,也只有私有的成员不能被继承;
- 在不同包中,如果无任何关系:只有public类的public成员才可以被外部的包访问;
- 在不同包中,如果有继承关系:
- 在子类内部:只有public类的public成员和protect成员可以被访问;
- 在子类外部:只有public类的public成员可以被访问;
3.2.如何使用不同包中的类
使用不同包中的类时,需要提前使用import关键字将包中的类导入:
import <包名>.*; //将该包中所有的类都导入
import <包名>.<类名>; //将该包中指定的类导入
4.归档工具jar
4.1..jar
文件
Java归档工具是jdk中提供的一种多用途的存档及压缩工具,可以将多个文件或目录合并为一个.jar归档文件。
.jar
文件的主要作用有:
- 发布和使用类库;
- 便于资源的组合和管理;
4.2.如何打包
- 将需要打包的文件放在一个干净的的文件夹下;
- 命令行进入该文件夹;
- 使用命令打包:
jar cvf <包名>.jar *
其中:
- jar是jdk中的打包工具;
- cvf是打包固定参数:c表示打包,v表示打包时输出信息,f表示打包的是文件;
- <打包后的文件名>.jre表示打包后的文件名;
- *表示将该文件夹下的所有文件打包;
4.3.如何打开/运行
- 使用解压缩工具或者jar工具使用xvf参数解压:
.jar
包中无启动类; - 命令行运行:
.jar
包中含有启动类(有main方法); - 双击运行:
.jar
包中含有启动类(有main方法),并且创建了图形化用户界面;
注:
如果我们仅仅想在别的文件中使用jar包中的类,需要将jar文件放置在该文件的目录下,否则,需要在classpath
环境变量中设置jar文件及其所在目录(需要将.jar文件也设置进去);
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。