22、包的定义与使用
包的定义
1、包指的是程序的目录。早期开发一个程序是将所有类写在一个java文件中,编译后程序将直接保存在根目录下。利用包可以实现程序拆分,将不同的类根据要求保存在不同目录中。
包的定义通过关键字package
完成。
范例:定义包
package com.java.demo;
public class Demo {
public static void main(String[] args) {
}
}
2、定义包时用.
表示子目录。如果类中有包的定义,就必须使其保存在对应的目录下,而这些目录不需要手动创建,可以使用命令自动生成:
(1)打包编译:java -d . Demo.java
|- -d
: 根据package
定义生成目录;
|-.
:设置保存路径。.
表示在当前路径下生成。
(2)解释程序时不要进入包中解释程序,而是在包外输入类的完整名称包.类
:
|- java com.java.demo.Demo
包的导入
1、使用包可以将一个完整的程序拆分为不同文件,从而分别保存。这存在问题:不同包间可能要进行互相访问,就需要进行导包操作,使用import
语句完成。
范例:定义com.java.util.Message
package com.java.util;
class Message{
public static void print(){
System.out.println("Hello World !");
}
}
定义com.java.test.TestMessage
package com.java.test;
import com.java..util.Message;
public class TestMessage {
public static void print() {
Message msg = new Message();
msg.print();
}
}
编译时,应先编译Message,再编译TestMessage:
|- javac -d . Message.java
|- javac -d . TestMessage.java
此时报错:Message在com.java.util中不是公共的; 无法从外部程序包中对其进行访问
出现上述问题是因为public class定义的类可以被不同的包访问;而class定义的类只能被本包所访问。因此我们要修改Message.java:
package com.java.util;
public class Message{
public static void print(){
System.out.println("Hello World !");
}
}
Java编译器考虑到大型程序开发,因此可以使用通配符*
:java -d . *.java
编译当前目录下所有java文件。
2、当要导入一个包中多个类时,可以使用import 包.*
package com.java.test;
import com.java..util.*;
public class TestMessage {
public static void print() {
Message msg = new Message();
msg.print();
}
}
import 包.*
并不是导入包中所有的类,而是只导入程序所需的类,因此不用担心性能问题。
3、一个Java文件可能导入多个包,而不同包中可能存在同名的类。现假设:
·com.java.util.Message;
·com.java.demo.Message.
package com.java.demo;
public class Message {
public static void print() {
System.out.println("世界你好!");
}
}
由于需要,要同时导入上述两个类:
package com.java.test;
import com.java.demo.Message;
import com.java.util.Message;
public class TestMessage {
public static void main(String[] args) {
Message msg = new Message();
msg.print();
}
}
系统报错:Error:(4, 1) java: com.java.demo.Message的 single-type-import 已定义具有相同简名的类型。
为了避免该错误,在使用类时,应加上包名:
package com.java.test;
import com.java.demo.Message;
import com.java.util.Message;
public class TestMessage {
public static void main(String[] args) {
com.java.demo.Message msg = new com.java.demo.Message();
Message.print();
}
}
系统常用包
Java提供了许多程序开发包,此外还有许多第三方包。Java自带的常见系统包如下:
(1)java.lang:包含了String、Object、Integer等类,此包系统自动导入;
(2)java.lang.reflect:反射开发包;
(3)java.util:Java的工具包,提供了大量的工具类,像链表;
(4)java.util.regex:正则工具包;
(5)java.text:国际化处理程序包;
(6)java.io:进行输入、输出处理以及文件操作;
(7)java.net:网络编程开发包;
(8)java.sql:数据库程序开发包;
(9)java.applet:Applet程序开发包(已经不用了);
|-Applet指的是在网页上嵌套的程序,可以使用Applet做一些动态效果,是采用绘图的方式完成的显示。随着时间的发展,Applet程序已经不再使用了(如果要再实现同样的功能,都是用Canvas绘图)。
(10)java.awt、javax.swing:图形界面的开发包,主要功能是开发单机程序界面。
|-JDK1.0时推出了awt开发包,但是这个开发包使用了大量的windows图形函数,使Java丧失了可移植性;
|-JDK1.2时推出了javax.swing开发包,是一个轻量级(Java自己开发的,不再使用windows),所以Java更名为Java2;
jar命令
使用jar命令压缩class文件,压缩的单位为包。
范例:定义Message.java文件
package com.java.util;
class Message{
public static void print(){
System.out.println("Hello World !");
}
}
编译后会生成class文件,此时要交付给用户使用,将改包的代码压缩:jar -cvf my.jar com
。生成的jar文件不能直接使用,必须配置CLASSPATH才能使用:SET CLASSPATH = .;jar包所在路径
。开发中需要使用大量的第三方jar文件,都需要配置CLASSPATH,最简单的配置就是在环境变量中配置。