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,最简单的配置就是在环境变量中配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章