java的包:库单元

我们用import关键字导入一个完整的库时,就会获得“包”(Package)。例如:
import java.util.*;
它的作用是导入完整的实用工具(Utility)库,该库属于标准Java开发工具包的一部分。由于Vector位于java.util里,所以现在要么指定完整名称“java.util.Vector”(可省略import语句),要么简单地指定一个“Vector”(因为import是默认的)。
若想导入单独一个类,可在import语句里指定那个类的名字:
import java.util.Vector;
现在,我们可以自由地使用Vector。然而,java.util中的其他任何类仍是不可使用的。
之所以要进行这样的导入,是为了提供一种特殊的机制,以便管理“命名空间”(Name Space)。我们所有类成员的名字相互间都会隔离起来。位于类A内的一个方法f()不会与位于类B内的、拥有相同“签名”(自变量列表)的f()发生冲突。但类名会不会冲突呢?假设创建一个stack类,将它安装到已有一个stack类(由其他人编写)的机器上,这时会出现什么情况呢?对于因特网中的Java应用,这种情况会在用户毫不知晓的时候发生,因为类会在运行一个Java程序的时候自动下载。
正是由于存在名字潜在的冲突,所以特别有必要对Java中的命名空间进行完整的控制,而且需要创建一个完全独一无二的名字,无论因特网存在什么样的限制。
迄今为止,本书的大多数例子都仅存在于单个文件中,而且设计成局部(本地)使用,没有同包名发生冲突(在这种情况下,类名置于“默认包”内)。这是一种有效的做法,而且考虑到问题的简化,本书剩下的部分也将尽可能地采用它。然而,若计划创建一个“对因特网友好”或者说“适合在因特网使用”的程序,必须考虑如何防止类名的重复。
为Java创建一个源码文件的时候,它通常叫作一个“编辑单元”(有时也叫作“翻译单元”)。每个编译单元都必须有一个以.java结尾的名字。而且在编译单元的内部,可以有一个公共(public)类,它必须拥有与文件相同的名字(包括大小写形式,但排除.java文件扩展名)。如果不这样做,编译器就会报告出错。每个编译单元内都只能有一个public类(同样地,否则编译器会报告出错)。那个编译单元剩下的类(如果有的话)可在那个包外面的世界面前隐藏起来,因为它们并非“公共”的(非public),而且它们由用于主public类的“支撑”类组成。
编译一个.java文件时,我们会获得一个名字完全相同的输出文件;但对于.java文件中的每个类,它们都有一个.class扩展名。因此,我们最终从少量的.java文件里有可能获得数量众多的.class文件。如以前用一种汇编语言写过程序,那么可能已习惯编译器先分割出一种过渡形式(通常是一个.obj文件),再用一个链接器将其与其他东西封装到一起(生成一个可执行文件),或者与一个库封装到一起(生成一个库)。但那并不是Java的工作方式。一个有效的程序就是一系列.class文件,它们可以封装和压缩到一个JAR文件里(使用Java 1.1提供的jar工具)。Java解释器负责对这些文件的寻找、装载和解释(注释①)。

①:Java并没有强制一定要使用解释器。一些固有代码的Java编译器可生成单独的可执行文件。

“库”也由一系列类文件构成。每个文件都有一个public类(并没强迫使用一个public类,但这种情况最很典型的),所以每个文件都有一个组件。如果想将所有这些组件(它们在各自独立的.java和.class文件里)都归纳到一起,那么package关键字就可以发挥作用)。
若在一个文件的开头使用下述代码:
package mypackage;
那么package语句必须作为文件的第一个非注释语句出现。该语句的作用是指出这个编译单元属于名为mypackage的一个库的一部分。或者换句话说,它表明这个编译单元内的public类名位于mypackage这个名字的下面。如果其他人想使用这个名字,要么指出完整的名字,要么与mypackage联合使用import关键字(使用前面给出的选项)。注意根据Java包(封装)的约定,名字内的所有字母都应小写,甚至那些中间单词亦要如此。
例如,假定文件名是MyClass.java。它意味着在那个文件有一个、而且只能有一个public类。而且那个类的名字必须是MyClass(包括大小写形式):

package mypackage;
public class MyClass {
// . . .

现在,如果有人想使用MyClass,或者想使用mypackage内的其他任何public类,他们必须用import关键字激活mypackage内的名字,使它们能够使用。另一个办法则是指定完整的名称:

mypackage.MyClass m = new mypackage.MyClass();

import关键字则可将其变得简洁得多:

import mypackage.*;
// . . .
MyClass m = new MyClass();

作为一名库设计者,一定要记住package和import关键字允许我们做的事情就是分割单个全局命名空间,保证我们不会遇到名字的冲突——无论有多少人使用因特网,也无论多少人用Java编写自己的类。

时间: 2024-10-06 08:04:21

java的包:库单元的相关文章

[Java] 利用Axis库调用C#的Web Service

[Java] 利用Axis库调用C#的Web Service 编写者 日期 关键词 郑昀@ultrapower 2005-8-2 Java Web Service Axis C#   概述 试图从Java调用C#编写的Web Service,借用了王咏刚的wsCaller源代码中DynamicInvoker类. 开始不清楚DynamicInvoker类的portName的含义,望文生义,以为是8080之类的端口号,实际上是下面wsdl中的wsdl:port 节点的"name"属性值&q

[Java] 利用xpdf库获取pdf文件的指定范围文本内容

[Java] 利用xpdf库获取pdf文件的指定范围文本内容 编写者 日期 关键词 郑昀@ultrapower 2005-8-2 Java PDF xpdf   概述 读取PDF文件的某一部分文本内容,可以使用开源项目xpdf. 从Java中调用xpdf,我们参照了<Java抽取Word,PDF的四种武器>文章最后提到的办法. 总而言之,调用xpdf十分简单,下面讲一下xpdf的配置问题. 系统基础环境要求 下面是对运行xpdf软件服务的计算机的要求: l         您可以从以下位置下载

Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. JSTL标签库,是由一些Java类组成的. JSTL组成: JSTL –Core 核心标签库. 重点 JSTL – I18N - 国际化标签库.Internationalization- I18N JSTL – SQL – 数据库操作标签(有悖于MVC设计模式),现在都不用这个. JSTL - Fu

JAVA - IO包的学习引导文章(摘抄)

什么是IO IO(Input/Output)是计算机输出/输出的接口.Java的核心库java.io提供了全面的IO接口,包括:文件读写,标准设备输出等等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入.此外,Java也对块传输提供支持,在核心库java.nio中采用的便是块IO.关于NIO我们在后面还有专门的讨论. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较复杂.Java IO模型 Java的IO模型设计非常优秀,它使用Decor

java.util包学习笔记一

笔记 学习java2SDK 1.4.0 java.util里边有几个重要的接口,列在这里作为学习的总结: 1 java.util.Enumeration有两个方法hasMoreElements(),nextElement().使用方法如下://打印向量v的所有元素for(Enumeratin e = v.elements(); e.hasMoreElements();){ System.out.println(e.nextElement().toString());}这里注意要调用nextEle

Java编程那些事儿74——java.lang包介绍

9.4 JDK API包名综述 在整个JDK API中,大约包含1.200个包,总体来看,包名第一个名称主要有三种:java.javax和org.其中以java开头的包名是JDK的基础语言包,以javax开头的属于JDK扩展包(其中x是extend的简写),而以org开头的则是第三方组织提供的功能包(org是organization的简写).而在JDK API中还包含了一些以com.sun开头的包名,这些是SUN公司提供的一些功能包,由于这些包中的类随着JDK版本的更改变化很大,不具备兼容性,所

通过HTTP加载Java资源包

使用资源包的另一个方法 请设想一下这种情况:您必须提供一个显示小部件,它能够从数据库中提取消息键(keys)和消息替代参数,在 Java 资源包中查找键,然后格式化消息并显示出来.惟一的问题是这个资源包位于 Web 应用程序中,而不是您的小部件所在的位置.事实上,Web 应用程序位于不同的服务器中. 这并不是 Java 资源包的典型使用情况,而可能是一场噩梦.您如何来实现这一点呢?为了不进行空泛的解释,本文包括了一个示例应用程序,供你下载运行.它将更轻松地向您演示并帮助您做到这点. 示例应用程序

通过Java.net包建立双向通讯

利用java.net包提供的网络能力.以有连接流通讯方式为例, 在服务器端的操作为一般为: ⑴ 创建一个ServerSocket对象,在指定端口监听客户端发来的请求. ⑵ 在接收到请求时accept()方法将返回一个Socket对象. ⑶ 用上述Socket对象创建输入.输出流对象. ⑷ 通过输入.输出流与客户交互. ⑸ 交互完毕,关闭输入.输出流与Socket. ⑹ 服务程序运行结束,关闭ServerSocket. 实现代码代码类如: try{ boolean flag=true; Socke

Java IO 包中的Decorator模式

JDK为程序员提供了大量的类库,而为了保持类库的可重用性,可扩展性和灵活性,其中使用到了大量的设计模式,本文将介绍JDK的I/O包中使用到的Decorator模式,并运用此模式,实现一个新的输出流类. Decorator模式简介 Decorator模式又名包装器(Wrapper),它的主要用途在于给一个对象动态的添加一些额外的职责.与生成子类相比,它更具有灵活性. 有时候,我们需要为一个对象而不是整个类添加一些新的功能,比如,给一个文本区添加一个滚动条的功能.我们可以使用继承机制来实现这一功能,

在eclipse里如何导入java.awt包呢

问题描述 在eclipse里如何导入java.awt包呢 java.awt的包到底在哪里可以下载,并且我的eclipse汉化也汉化不了. 解决方案 import java.awt.*;