1、包,提供类的多层类命名空间。也就是对类文件进行分门别类,就像用文件夹来管理文件一样,会使得管理更方便,也避免了类名冲突的问题
package example.four.aa;
class Test
{...}
这条语句说明,该文件中的所有类都是放在example.four.aa包中的,位于此包中的每个类的完整类名应该是包名+类名的组合,即example.four.aa.Test。
package语句作为java源文件的第一条语句,指明该文件中定义的类所在的包,必须把包的声明放在云文件的最前面,每个源文件只能生命一个包。
2、javac -d . Test.java
在编译时我们输入该命令,系统会根据package example.four.aa;,自动在当前目录下建一个example文件夹,且example文件夹中又有个four文件夹,four中有个aa文件夹,aa中有个生成的Test.class文件。整个过程是自动完成的,我们只需要输入命令即可
3、同一个包中的类相互访问,不需要加包名;不同包之间的类相互访问,需要加上包名。
1 package example.four.aa; 2 class Test 3 { 4 public int divide(int x,int y) throws ArithmeticException,example.four.DivideByMinusException 5 { 6 if(y<0) 7 throw new example.four.DivideByMinusException("the divisor is negative "+y); 8 //这里抛出的异常对象,就是catch(Exception e)中的e 9 int result=x/y; 10 return result; 11 } 12 }
example.four.aa包中的Test类方法中有用到example.four的DivideByMinusException方法,则需要在其前加上对应包名。
4、import关键字
那么问题又来了,我们每次都加上这样的包名作为前缀会很长,那我们需要引入import关键字
import example.four.*;表明我们引入example.four这个包中的所有类,就省去我们在DivideByMinusException前加上example.four了。
import example.four.*;//表示引入example.four中的所有类
import example.four.aa.*;//表示引入example.four.aa中的所有类
尽管aa是在example.four的下一级,但是,我们在引入的时候,只要用到aa中的类,就要用import引入。
5、
Test.java
1 package example.four.aa; 2 import example.four.*; 3 public class Test 4 { 5 public int divide(int x,int y) throws ArithmeticException,DivideByMinusException 6 { 7 if(y<0) 8 throw new example.four.DivideByMinusException("the divisor is negative "+y); 9 //这里抛出的异常对象,就是catch(Exception e)中的e 10 int result=x/y; 11 return result; 12 } 13 }
DivideByMinusException.java
1 package example.four; 2 public class DivideByMinusException extends Exception 3 { 4 public DivideByMinusException(String msg) 5 { 6 super(msg); 7 } 8 }
lesson61.java
1 package example.four; 2 import example.four.*; 3 import example.four.aa.*; 4 class TestException 5 { 6 public static void main(String [] args) 7 { 8 Test t=new Test(); 9 try{ 10 t.divide(2,-1); 11 System.out.println("the divide opration is over"); 12 } 13 catch(ArithmeticException e) 14 { 15 System.out.println("Error ~ ArithmeticException"); 16 e.printStackTrace();//Exception类中的方法 17 } 18 19 catch(DivideByMinusException e) 20 { 21 System.out.println("Error ~ DivideByMinusException"); 22 e.printStackTrace(); 23 //return;//结束函数,有返回值的返回值,所以不会打印出B 24 //System.exit(0);//表示程序到此终止 25 } 26 catch(Exception e) 27 { 28 System.out.println(e.getMessage());//打印出the divisor is negative -1 29 e.printStackTrace(); 30 } 31 finally 32 { 33 System.out.println("finally~");//A语句 34 } 35 System.out.println("the program is running here!");//B语句 36 } 37 }
这是之前写的一个程序,为了巩固包的知识点,把它拆开,并将编译后的Test.class文件放在example.four.aa包中,将其他两个文件编译后放在example.four包中。lesson61.java需要访问Test类中的方法,那么该类需要声明为public,否则无法访问。在运行TestException.class文件时,要记住classpath一定要是顶层包名所在的父目录,且类名要写全。即F:java_examplelesson61>java example.four.TestException
6、访问控制
类成员访问控制:
private访问控制 只能在类内部被使用;
缺省类型访问控制 只能在同包中被引用;
protected 访问控制 可以在同一个包中被访问,也可以在属于不同包的子类中被访问;
public访问控制 都可以访问。
类的访问控制:
public和缺省类型,和上面一样,缺省类型的访问控制只能被同一个包中的所有类访问
7、jar
F:java_examplelesson61>jar
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
常用命令:
F:java_examplelesson61>jar -cvf lesson61.jar example com
将example和com两个文件压缩,且命名为lesson61.jar,放在F:java_examplelesson61目录下。v 显示打包的详细过程
F:java_examplelesson61>jar -xvf lesson61.jar 将lesson61.jar在当前目录下解压缩
有时候如果一个jar包里面文件很多,我们可以将它当中的文件名重定向到一个新的文件中
jar -tvf rt.jar>c: t.txt
将rt.jar中的文件名写到rt.txt文件中,且该文件放在c盘