4.5 包

Java程序中,包的作用是组织类,类的加载依赖于classpath环境变量。包名需在源文件中通过package语句指定,而非由目录结构决定。类加载时,虚拟机会在classpath指定的目录中按包名结构查找.class文件。错误可能源于文件名错误、未import相应包、classpath设置不正确。文章还提到了常用的Java包,如java.lang、java.awt等。
摘要由CSDN通过智能技术生成
package org.it315;
public class TestPackage{
    public static void main(String[] args){
        new Test().print();
    }
}
class Test{
    public void print(){
        System.out.println("the program is demostrating how to using package!");
    }
}

当虚拟机要装载orgit315TestPackage类时它会沿着classpath环境变量指定的路径中去逐一查找,查找这些路径下是否有 org 子目录,接着在org 目录中又去查找315子目录最后在it315目录中去查找 TestPackageclass 文件名看其中是否包含orgit315.TestPackage类。虚拟机在装载带有包名的类时,会先找到 classpath 环境变量指定的目录,再在这些目录中,按照与包名层次相对应的日录结构去查找.class 文件

1.即使文件名都是 TestPackage.class,但其中包含的类的完整名称却不一定相同,如orgit315.TestPackage 类与comSUN.TestPackage 类的文件名都是 TestPackage.class,但却是两个完全不同的类,应存放在不同的目录结构中。

2.同一个包中的类不必位于同样的目录,如orgit315.Classl与orgit315.Class2,完全可以一个位于c盘某个位置,另一个位于d盘某个位置,只要 classpath 分别指向这两个位置就可以了。有了包的概念,我们就可以理解 Java 实际上是通过 classpath 去寻找顶层包名的原理了

很多初学者常常误以为把一个类放在某个目录下,这个目录名就成了这个类的包名再次强调,不是有了目录结构,就等于有了包名,包名必须在程序中通过 package 语句指定,而不是靠目录结构来指定的,是先要有了包名后,才需要相应的目录结构。刚才的类名是 TestPackage (在源文件中去掉了 package 语句),所以,尽管 classpath设置中包含了c:liavawork 目录,在该目录中也有 orglit315 子目录,但编译生成的.class文件中并不存在完整名为 org.it315.TestPackage 的类。从分析上来看,解释器应该报告找不到 orgit315.TestPackage 这个类,但严格按照上面步骤进行操作的读者做这个试验时,运行的结果一切正常。如果是这样,你就对下面的分析容易理解多了和能够产生刻骨铭心的记忆了。这是因为: 你运行上面命令时的当前目录还在 c:myiava 下且 classpath 环境属性包含当前目录 (注意,即使没有显示包含.,也有可能的),你运行的就是你先前的那个正确的 org.it315.TestPackage 类,而不是你刚才重新编译的这个类。删除 c:lmyjavalorg 目录,重新运行,你就能够看到我们分析的错误了

类似上面的这个问题,在实际应用中也是经常发生的事情,虽然编译了一个修改过的.java 源文件,但运行可能是某个旧的.class 文件,特别是旧的.class 文件所在的目录在classpath 环境变量中的位置,位于新的.class 文件所在的目录的前面,问题就更加隐蔽了,当我们在编程过程中遇到了问题,有时并不是程序本身所带来的问题,需要我们放眼全局,思路更加开阔一些,从多个方面去思考和解决问题

有关包的其他细节:

package 语句作为 Java 源文件的第一条语句,指明该文件中定义的类所在的包,必须把包声明放任源文件的最前面,每个源文件只能声明一个包。

如果没有 package 语句,则为默认无名包。但实际项目应用中,没有使用无名包的类读者就把这当作是一个硬性规定吧,这不仅是一个良好的编程习惯,而且有助于在日后实际工作中避免许多可能碰到的麻烦

父包和子包之间,能从语意上表示某种血缘和亲近关系,如 org.it315.*,org.it315.mail.*从包名上可以看出这些类都是 it315 这个组织(或公司)开发的类,org.it315.mail.*还能更进一步地说明其中的类是专用于 mail 项目的。但父包和子包在使用上没有任何关系,如父包中的类调用子包中的类,必须引用子包的全名,而不能省略父包名部分。另外,当我们import 了一个包中所有的类,并不会import 这个包中的子包中的类,如果程序中用到了子包的类,需要再次对子包作单独引入,如我们以后会见到在同一程序中,经常同时出现下面的两条语句:

import java.awt.*;

import java.awt.event.*;

不管是在培训班上,还是在各大网站的论坛上,这都是一个初学者常问的问题,从上面打出来的信息,我们知道错误的现象是找不到 Temmp 类,相信很多读者都遇到过这样的错误。正好讲完了怎样导入包,也讲完了 classpath,现在可以总结一下找不到类的原因了大致有三种情况:

(1)把文件名字写错了

这种情况碰到的次数最多,也比较好排除,只要了解了Java 的一些简单的书写规则再细心一些,相信不会难倒读者的。如 Java 是大小写敏感的,但初学者很容易犯把 Test写成test之类的错误。

(2)没有import 类所在的包名

如果你能确认不是拼写的错误,那你可能忘记用 immport 语句来引入该类所在包名了

(3) classpath 设置错误如果上面两种错误的可能性都排除了,那就可能是计算机上压根儿就没有这个类文件或者你的计算机上即使有这个类文件,你的 classpath 环境变量可能没有正确指向该类所在的iar包(参看本章最后的部分)或文件目录。我们在第1章中详细介绍了 casspath 的用法,不熟悉的读者请再返回去看一下

SUN 公司在JDK 中为我们提供了大量的各种实用类,通常称之为 API (ApplicationProgrammingInterface),这些类按功能不同分别被放入了不同的包中,供我们编程使用下面简要介绍其中最常用的六个包:

1.java.lang一一包含一些 Java 语言的核心类,如 String、Math、Integer、System 和1.提供常用功能。Thread,

2.java.awt-包含了构成抽象窗口工具集 (abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)

3.java.applet一包含 applet 运行所需的一些类

4.java.net-包含执行与网络相关的操作的类

5.java.io--包含能提供多种输入/输出功能的类

6.java.util---包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值