包的生成和引入
包的定义: package 包名称.子包名称;
生成class字节码文件时需要严格按照包的路径来生成相关文件夹:javac -d . Demo.java , .表示在当前路径下生成文件夹。
类的导入:import 包名称.子包名称.类名称; //手工导入所需要的类 (或 import 包名称.子包名称.*; //由JVM自动加载所需的类)
静态导入:如果一个类中的方法全部是使用static声明的静态方法,则在导入时就可以直接使用 import static 包.类.*; 的方式进行导入,这样就可以直接使用其静态方法,而不需要使用“类.方法()”的形式调用。
jar命令的使用:
jar -cvf my.jar 包名称 // 这样会把前面class文件所在的包(文件夹)打包成一个jar格式的压缩文件。c(create), V(详细的输出信息), F(指定存档的文件名)
查看jar中的全部内容:jar -tvf my.jar // t(列出存档内容的列表)
如需解压缩jar包,可输入:jar -xf my.jar // x(展开存档中的文件)
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-points ...
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序指定应用程序入口点
-0 仅存储; 不使用情况任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。清单文件名, 归档文件名和入口点名称的指定顺序与 'm', 'f' 和 'e' 标记的指定顺序相同。示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中: jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并将 foo/ 目录中的所有文件归档到 'classes.jar' 中: jar cvfm classes.jar mymanifest -C foo/ .
另外,由于严格的路径约束,在java文件中引入依赖的jar包时,需要指定字节码文件路径。如SET CLASSPATH=.;f: estmy.jar ,.;代表在当前路径查找,这里设置了两个classpath目录。
(注:如若在执行javac命令时报错“需要class,interface或enum”,此乃编辑工具带来的字符编码问题,用记事本编辑拷贝,首字母手动重新输入即可解决。)
包的访问权限
范 围 | private | default | protected | public |
同一类 | ||||
同一包中的类 | ||||
不同包的子类 | ||||
其他包中的类 |
注意,private比较独特,不同包的子类的含义是,在包PB的类B中引入包PA,并使得B extends A,这样如果A声明为protected权限,那么类B也是可以通过继承类A来使用A中方法的。假使类B不继承类A,除非类A被声明为public权限,否则在类B中无法直接对声明为protected的类A进行实例化,这也就是表格中的“其他包中的类”这种情形。此外,表格中绿色代表拥有相应的访问权限,红色代表不拥有相应的访问权限。
注意:一个java文件中可以有(定义)多个并行层级关系的class,但是只能有一个public修饰符的calss。试想,如果有多个class声明为public权限,那么包也就很难发挥出其本质的能力——命名空间。这种方式,势必将导致不同包的class发生命名冲突,如果一个java文件内只定义一个public class,那么文件名和public class绑定,即便不同包内有相同名称的public class,也无妨,编译器不会报错。因此,除了public class以外的class在定义时,一般会采用default的权限,这样最为稳妥,也是惯例,这样很好的起到了防止命名冲突的效用。