第6节 包的应用
7.6 包的应用
包
为了解决类名冲突,Java提供包来管理类名空间
Java利用包来组织相关的类,并控制访问权限
包是一种松散的类的集合,利用包来管理类,可实现类的共享与复用
同一包中的类在缺省情况下可以互相访问,通常把需要在一起工作的类放在一个包里
7.6.1 Java 基础类库简介2
Java基础类库
Java提供了用于语言开发的类库,称为Java基础类库(JFC,Java Foundational Class) 也称应用程序编程接口(API,Application Programming Interface),分别放在不同的包中
Java提供的包主要有
java.lang,java.io,java.math,java.util
java.applet,java.awt,java.awt.datatransfer
java.awt.event,java.awt.image,java.beans
java.net,java.rmi,java.security,java.sql等
7.6.1 Java基础类库简介——语言包
语言包(java.lang)
语言包java.lang提供了Java语言最基础的类,包括
Object类
数据类型包裹类(the Data Type Wrapper)
字符串类(String、StringBuffer)
数学类(Math)
系统和运行时类(System、Runtime)
类操作类(Class,ClassLoader)
7.6.1 Java基础类库简介——数据类型包裹类
数据包裹类
对应Java的每一个基本数据类型(primitive data type)都有一个数据包裹类每个包裹类都只有一个类型为对应的基本数据类型的属性域

7.6.1 Java基础类库简介——生成数据类型包裹类对象的方法

7.6.1 Java基础类库简介——得到基本数据类型数据的方法

7.6.1 Java基础类库简介——类操作类(Class、ClassLoader)
Class类
提供运行时信息,如名字、类型以及父类
Object类中的getClass方法返回当前对象所在的类,返回类型是Class
它的getName方法返回一个类的名称,返回值是String
它的getSuperclass方法可以获得当前对象的父类
ClassLoader类
提供把类装入运行时环境的方法
Class类应用举例

运行结果:
class BankAccount
BankAccount
7.6.1 Java基础类库简介——实用包
实用包(java.util)——实现各种不同实用功能
日期类:描述日期和时间
Date
Calendar
GregorianCalendar
集合类
Collection(无序集合)、Set(不重复集合)
List(有序不重复集合)、Enumeration(枚举)
LinkedList(链表)、Vector(向量)
Stack(栈)、Hashtable(散列表)、TreeSet(树)
StringTokenizer类
允许以某种分隔标准将字符串分隔成单独的子字符串
Date类
常用方法
getTime()
返回一个长整型表示时间,单位为毫秒(millisecond)
after(Date d)
返回接收者表示的日期是否在给定的日期之后
before(Date d)
返回接收者表示的日期是否在给定的日期之前构造方法
Date() 获得系统当前日期和时间值。
Date(long date) 以date创建日期对象,date表示从GMT(格林威治)时间1970-1-1 00:00:00开始至某时刻的毫秒数
Calendar类
一个抽象的基础类,支持将Date对象转换成一系列单个的日期整型数据集,如YEAR、MONTH、DAY、HOUR等常量
它派生的GregorianCalendar类实现标准的Gregorian日历
由于Calendar是抽象类,不能用new方法生成Calendar的实例对象,可以使用getInstance()方法创建一个GregorianCalendar类的对象
Calendar类
Calendar类中声明的常量
Calendar.SUNDAY
Calendar.MONDAY
Calendar.TUESDAY Calendar.SATURDAY
Calendar.JANUARY
Calendar.FEBRUARY
Calendar.AM
...
Calendar类中的方法
isLeapYear(int year) 返回给定的年份是否是润年
get(int field) 取得特定Calendar对象的信息aCalendar.get(java.util.Calendar.YEAR);
aCalendar.get(java.util.Calendar.MONTH);aCalendar.get(java.util.Calendar.DAY_OF_WEEK);
aCalendar.get(java.util.Calendar.MINUTE);set(int field, int value) 给日期域设定特定的值
aCalendar.set(Calendar.MONTH, Calendar.JANUARY);
aCalendar.set(1999, Calendar.AUGUST, 15); ...
GregorianCalendar类
用于查询及操作日期
构造方法
new GregorianCalendar() // 当前日期
new GregorianCalendar(1999, 11, 31) // 特定日期
new GregorianCalendar(1968, 0, 8, 11, 55) // 日期和时间
getTime()方法 返回Date对象,显示日历
System.out.println(new GregorianCalendar().getTime());
System.out.println(new GregorianCalendar(1999, 11, 31).getTime());
System.out.println(new GregorianCalendar(1968, 0, 8, 11, 55).getTime());
7.6.1 Java基础类库简介(续)——StringTokenizer类
StringTokenizer类
允许以某种分隔标准将字符串分隔成单独的子字符串,如可以将单词从语句中分离出来术语分隔符(delimeter)是指用于分隔单词(也称为标记,tokens)的字符
常用方法
int countTokens() 返回单词的个数
String nextToken() 返回下一个单词
boolean hasMoreTokens() 是否还有单词
7.6.1 Java基础类库简介(续)——生成StringTokenizer类对象的方法
生成StringTokenizer类的对象的方法
new StringTokenizer(String aString);
指定了将被处理的字符串,没有指定分隔符(delimeter),这种情况下缺省的分隔符为空格new StringTokenizer(String aString, String delimiters);
除了指定将被处理的字符串,还指定了分隔符字符串,如分隔符字符串可以为“,:;|_()”
new StringTokenizer(String aString, String delimiters, boolean returnDelimiters);
第三个参数如果为true,则分隔符本身也作为标记返回
7.6.1 Java基础类库简介(续)——文本包
提供各种文本或日期格式
包含
Format类
DateFormat类
SimpleDateFormat类
使用已定义的格式对日期对象进行格式化
构造方法 以一指定格式的字符串作为参数
new java.text.SimpleDateFormat(formatString);
format(Date d) 将此种格式应用于给定的日期
aSimpleDateFormat.format(aDate);
7.6.1 Java基础类库简介(续)——一个例子
各种格式字符串及其在日期2004年4月26日下午12:08的应用结果

7.6.2 自定义包
自定义包
包是一组类的集合,利用包来管理类,可实现类的共享与复用
同一包中的类在缺省情况下可以互相访问,通常把需要在一起工作的类放在一个包里
在实际使用中,用户可以将自己的类组织成包结构
7.6.2 自定义包(续)——包的声明
包的声明
包名
通常全部用小写字母
且每个包的名称必须是“独一无二”的,为避免包名冲突,可将机构的Internet域名反序,作为包名的前导
例如:cn.edu.bupt.computer.class0301
声明语句package mypackage;
说明当前文件中声明的所有类都属于包mypackage
此文件中的每一个类名前都有前缀mypackage,即实际类名应该是mypackage.ClassName,因此不同包中的相同类名不会冲突
Package语句
Java源文件的第一条语句, 前面只能有注释或空行
一个文件中最多只能有一条
如果源文件中没有,则文件中声明的所有类属于一个默认的无名包
包声明的语句的完整格式如下:
package pkg1[.pkg2[.pkg3…]];
Java编译器把包对应于文件系统的目录结构
用点来指明目录的层次
7.6.2 自定义包(续)——编译和生成包
编译和生成包
如果在程序Test.java中已声明了包mypackage
编译时采用方式 javac -d destpath Test.java
则编译器会自动在destpath目录下建立子目录mypackage,并将生成的.class文件都放到destpath/mypackage下。
不使用d选择符
在当前目录(源程序文件所在的目录)下建立子目录mypackage
7.6.2 自定义包(续)——包的使用
假设已定义并生成了下面的包
package mypackage;
public class MyClass { // . . . }
如果其他人想使用MyClass类
使用import语句引入import mypackage.*;
// . . . MyClass m = new MyClass();
不使用import语句,则需要使用全名
mypackage.MyClass m = new mypackage.MyClass();
7.6.2 自定义包(续)
package PackageA;
import PackageB.*;
public class A1
{ public void FunA()
{B1 obj=new B1();
A2 two=new A2();
}
}class A2
{ public void FunA2()
{A1 obj1=new A1();
B2 obj2=new B2(); }
}package PackageB;
import PackageA.*;
public class B1
{public void FunB() { A1 obj=new A1();
B2 two=new B2(); }
}class B2
{public void FunB2()
{ B1 obj1=new B2();
A1 obj2=new A1(); }}
7.6.2 自定义包(续)——举例
import PackageA.*;
import PackageB.*;
public class PackageTest
{ public static void main(String[ ] args)
{ A1 Myobj=new A1();
System.out.println("An object of class A1 has been created!"); }}
7.6.3 JAR文件
JAR文件
Java 的一种文档格式
JAR文件格式
非常类似 ZIP 文件,唯一区别就是在 JAR 文件的内容中包含了
META-INF/MANIFEST.MF 文件
在生成 JAR 文件的时候自动创建
部署描述符
用来指示工具如何处理
特定的JAR文件
JAR文件的功能
压缩和发布文件
相比于ZIP文件,具有如下优势和功能
安全性:可以对 JAR 文件内容加上数字化签名减少下载时间:浏览器可以在一个 HTTP 事务中下载JAR文件包含的所有类
文件和相关资源
传输平台扩展:Java 扩展框架提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的
包密封:存储在 JAR 文件中的包可以选择进行密封,以增强版本一致性和安全性
包版本控制:一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息
可移植性:处理 JAR 文件的机制是 Java 平台核心API 的标准部分,因此具有很好的可移植性
META-INF目录
大多数 JAR 文件包含一个 META-INF 目录
存储包和扩展的配
置数据,如安全性和版本信息
Java 2 平台识别并解释 该 目录中的下述文件和目录,以便配置应用程序
MANIFEST.MF
定义了与扩展和包相关的数据
INDEX.LIST
由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程
xxx.SF
JAR 文件的签名文件,xxx 标识了签名者
xxx.DSA与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名
jar工具
为了用 JAR 文件执行基本的任务,要使用JDK提供的 jar 工具(Java Archive Tool)
随 JDK 安装,在JDK 安装目录下的 bin 目录中
Windows 下文件名为 jar.exe
Linux 下文件名为 jar
它的运行需要用到JDK 安装目录下 lib 目录中的 tools.jar 文件
用 jar 命令调用


常用jar工具

可执行的JAR文件包
可执行的 JAR文件包
一个可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的JAR文件中可以由 JVM 直接执行它而无需事先提取文件或者设置类路径,不用知道它的主要入口点有助于方便发布和执行 Java 应用程序

包
为了解决类名冲突,Java提供包来管理类名空间
Java利用包来组织相关的类,并控制访问权限
包是一种松散的类的集合,利用包来管理类,可实现类的共享与复用
同一包中的类在缺省情况下可以互相访问,通常把需要在一起工作的类放在一个包里
7.6.1 Java 基础类库简介2
Java基础类库
Java提供了用于语言开发的类库,称为Java基础类库(JFC,Java Foundational Class) 也称应用程序编程接口(API,Application Programming Interface),分别放在不同的包中
Java提供的包主要有
java.lang,java.io,java.math,java.util
java.applet,java.awt,java.awt.datatransfer
java.awt.event,java.awt.image,java.beans
java.net,java.rmi,java.security,java.sql等
7.6.1 Java基础类库简介——语言包
语言包(java.lang)
语言包java.lang提供了Java语言最基础的类,包括
Object类
数据类型包裹类(the Data Type Wrapper)
字符串类(String、StringBuffer)
数学类(Math)
系统和运行时类(System、Runtime)
类操作类(Class,ClassLoader)
7.6.1 Java基础类库简介——数据类型包裹类
数据包裹类
对应Java的每一个基本数据类型(primitive data type)都有一个数据包裹类每个包裹类都只有一个类型为对应的基本数据类型的属性域

7.6.1 Java基础类库简介——生成数据类型包裹类对象的方法

7.6.1 Java基础类库简介——得到基本数据类型数据的方法

7.6.1 Java基础类库简介——类操作类(Class、ClassLoader)
Class类
提供运行时信息,如名字、类型以及父类
Object类中的getClass方法返回当前对象所在的类,返回类型是Class
它的getName方法返回一个类的名称,返回值是String
它的getSuperclass方法可以获得当前对象的父类
ClassLoader类
提供把类装入运行时环境的方法
Class类应用举例

运行结果:
class BankAccount
BankAccount
7.6.1 Java基础类库简介——实用包
实用包(java.util)——实现各种不同实用功能
日期类:描述日期和时间
Date
Calendar
GregorianCalendar
集合类
Collection(无序集合)、Set(不重复集合)
List(有序不重复集合)、Enumeration(枚举)
LinkedList(链表)、Vector(向量)
Stack(栈)、Hashtable(散列表)、TreeSet(树)
StringTokenizer类
允许以某种分隔标准将字符串分隔成单独的子字符串
Date类
常用方法
getTime()
返回一个长整型表示时间,单位为毫秒(millisecond)
after(Date d)
返回接收者表示的日期是否在给定的日期之后
before(Date d)
返回接收者表示的日期是否在给定的日期之前构造方法
Date() 获得系统当前日期和时间值。
Date(long date) 以date创建日期对象,date表示从GMT(格林威治)时间1970-1-1 00:00:00开始至某时刻的毫秒数
Calendar类
一个抽象的基础类,支持将Date对象转换成一系列单个的日期整型数据集,如YEAR、MONTH、DAY、HOUR等常量
它派生的GregorianCalendar类实现标准的Gregorian日历
由于Calendar是抽象类,不能用new方法生成Calendar的实例对象,可以使用getInstance()方法创建一个GregorianCalendar类的对象
Calendar类
Calendar类中声明的常量
Calendar.SUNDAY
Calendar.MONDAY
Calendar.TUESDAY Calendar.SATURDAY
Calendar.JANUARY
Calendar.FEBRUARY
Calendar.AM
...
Calendar类中的方法
isLeapYear(int year) 返回给定的年份是否是润年
get(int field) 取得特定Calendar对象的信息aCalendar.get(java.util.Calendar.YEAR);
aCalendar.get(java.util.Calendar.MONTH);aCalendar.get(java.util.Calendar.DAY_OF_WEEK);
aCalendar.get(java.util.Calendar.MINUTE);set(int field, int value) 给日期域设定特定的值
aCalendar.set(Calendar.MONTH, Calendar.JANUARY);
aCalendar.set(1999, Calendar.AUGUST, 15); ...
GregorianCalendar类
用于查询及操作日期
构造方法
new GregorianCalendar() // 当前日期
new GregorianCalendar(1999, 11, 31) // 特定日期
new GregorianCalendar(1968, 0, 8, 11, 55) // 日期和时间
getTime()方法 返回Date对象,显示日历
System.out.println(new GregorianCalendar().getTime());
System.out.println(new GregorianCalendar(1999, 11, 31).getTime());
System.out.println(new GregorianCalendar(1968, 0, 8, 11, 55).getTime());
7.6.1 Java基础类库简介(续)——StringTokenizer类
StringTokenizer类
允许以某种分隔标准将字符串分隔成单独的子字符串,如可以将单词从语句中分离出来术语分隔符(delimeter)是指用于分隔单词(也称为标记,tokens)的字符
常用方法
int countTokens() 返回单词的个数
String nextToken() 返回下一个单词
boolean hasMoreTokens() 是否还有单词
7.6.1 Java基础类库简介(续)——生成StringTokenizer类对象的方法
生成StringTokenizer类的对象的方法
new StringTokenizer(String aString);
指定了将被处理的字符串,没有指定分隔符(delimeter),这种情况下缺省的分隔符为空格new StringTokenizer(String aString, String delimiters);
除了指定将被处理的字符串,还指定了分隔符字符串,如分隔符字符串可以为“,:;|_()”
new StringTokenizer(String aString, String delimiters, boolean returnDelimiters);
第三个参数如果为true,则分隔符本身也作为标记返回
7.6.1 Java基础类库简介(续)——文本包
提供各种文本或日期格式
包含
Format类
DateFormat类
SimpleDateFormat类
使用已定义的格式对日期对象进行格式化
构造方法 以一指定格式的字符串作为参数
new java.text.SimpleDateFormat(formatString);
format(Date d) 将此种格式应用于给定的日期
aSimpleDateFormat.format(aDate);
7.6.1 Java基础类库简介(续)——一个例子
各种格式字符串及其在日期2004年4月26日下午12:08的应用结果

7.6.2 自定义包
自定义包
包是一组类的集合,利用包来管理类,可实现类的共享与复用
同一包中的类在缺省情况下可以互相访问,通常把需要在一起工作的类放在一个包里
在实际使用中,用户可以将自己的类组织成包结构
7.6.2 自定义包(续)——包的声明
包的声明
包名
通常全部用小写字母
且每个包的名称必须是“独一无二”的,为避免包名冲突,可将机构的Internet域名反序,作为包名的前导
例如:cn.edu.bupt.computer.class0301
声明语句package mypackage;
说明当前文件中声明的所有类都属于包mypackage
此文件中的每一个类名前都有前缀mypackage,即实际类名应该是mypackage.ClassName,因此不同包中的相同类名不会冲突
Package语句
Java源文件的第一条语句, 前面只能有注释或空行
一个文件中最多只能有一条
如果源文件中没有,则文件中声明的所有类属于一个默认的无名包
包声明的语句的完整格式如下:
package pkg1[.pkg2[.pkg3…]];
Java编译器把包对应于文件系统的目录结构
用点来指明目录的层次
7.6.2 自定义包(续)——编译和生成包
编译和生成包
如果在程序Test.java中已声明了包mypackage
编译时采用方式 javac -d destpath Test.java
则编译器会自动在destpath目录下建立子目录mypackage,并将生成的.class文件都放到destpath/mypackage下。
不使用d选择符
在当前目录(源程序文件所在的目录)下建立子目录mypackage
7.6.2 自定义包(续)——包的使用
假设已定义并生成了下面的包
package mypackage;
public class MyClass { // . . . }
如果其他人想使用MyClass类
使用import语句引入import mypackage.*;
// . . . MyClass m = new MyClass();
不使用import语句,则需要使用全名
mypackage.MyClass m = new mypackage.MyClass();
7.6.2 自定义包(续)
package PackageA;
import PackageB.*;
public class A1
{ public void FunA()
{B1 obj=new B1();
A2 two=new A2();
}
}class A2
{ public void FunA2()
{A1 obj1=new A1();
B2 obj2=new B2(); }
}package PackageB;
import PackageA.*;
public class B1
{public void FunB() { A1 obj=new A1();
B2 two=new B2(); }
}class B2
{public void FunB2()
{ B1 obj1=new B2();
A1 obj2=new A1(); }}
7.6.2 自定义包(续)——举例
import PackageA.*;
import PackageB.*;
public class PackageTest
{ public static void main(String[ ] args)
{ A1 Myobj=new A1();
System.out.println("An object of class A1 has been created!"); }}
7.6.3 JAR文件
JAR文件
Java 的一种文档格式
JAR文件格式
非常类似 ZIP 文件,唯一区别就是在 JAR 文件的内容中包含了
META-INF/MANIFEST.MF 文件
在生成 JAR 文件的时候自动创建
部署描述符
用来指示工具如何处理
特定的JAR文件
JAR文件的功能
压缩和发布文件
相比于ZIP文件,具有如下优势和功能
安全性:可以对 JAR 文件内容加上数字化签名减少下载时间:浏览器可以在一个 HTTP 事务中下载JAR文件包含的所有类
文件和相关资源
传输平台扩展:Java 扩展框架提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的
包密封:存储在 JAR 文件中的包可以选择进行密封,以增强版本一致性和安全性
包版本控制:一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息
可移植性:处理 JAR 文件的机制是 Java 平台核心API 的标准部分,因此具有很好的可移植性
META-INF目录
大多数 JAR 文件包含一个 META-INF 目录
存储包和扩展的配
置数据,如安全性和版本信息
Java 2 平台识别并解释 该 目录中的下述文件和目录,以便配置应用程序
MANIFEST.MF
定义了与扩展和包相关的数据
INDEX.LIST
由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程
xxx.SF
JAR 文件的签名文件,xxx 标识了签名者
xxx.DSA与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名
jar工具
为了用 JAR 文件执行基本的任务,要使用JDK提供的 jar 工具(Java Archive Tool)
随 JDK 安装,在JDK 安装目录下的 bin 目录中
Windows 下文件名为 jar.exe
Linux 下文件名为 jar
它的运行需要用到JDK 安装目录下 lib 目录中的 tools.jar 文件
用 jar 命令调用


常用jar工具

可执行的JAR文件包
可执行的 JAR文件包
一个可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的JAR文件中可以由 JVM 直接执行它而无需事先提取文件或者设置类路径,不用知道它的主要入口点有助于方便发布和执行 Java 应用程序




