包的概念
包是Java语言提供的一种确保类名唯一性的机制,是类的一种组织和管理方式、是一组功能相似或相关的类或接口的集合。
- 一个完整的类名是包名+类名,在没有import导入的情况下,使用一个类需要给出完整的类名,如java.util.Date。为了方便,Java自动导入两个包:java.lang包和默认包。
- 无包的类可以访问有包的类, 直接导入即可;有包的类无法访问无包的类, 直接访问是访问同一个包中的, 而有包的类与无包的类不在一个包里。由于使用不同包中的类需要导入, 而无包的类因无包名无法导入;
- Java的包表面上看(从路径上看)是有等级的,但实际上并没有,比如java.awt,java.awt.color是两个地位相同的包。java.awt.color并不属于java.awt。
- 在采用类名方式使用一个类的时候, 先在当前包中查找是否有这个类, 如果没有才去导入的包中找。
包的作用
- 方便组织自己的代码,并将自己的代码与别人提供的代码库分开管理。
- 将相关联的接口和类集合到一块。比如,package graphics; 就把图形处理相关的模块放到了一起。便于使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 实现了外界对包的访问控制。 需要先进行导入。
定义包
要想将一个类放入一个包中,必须在源文件中除注释以外的第一行使用package+包名语句。同时将属于包的文件放在与完整的包名匹配的子目录中。当需要调用此包中的类时,就可以使用关键字import进行导入。如果源文件中没有使用package语句,这个源文件中的类就会被放置在一个默认包(default package)中。默认包是一个没有名字的包。
一、在定义包的时候,应该注意几点:
- 为了尽量使包名保持唯一性,包名通常采用小写、按倒写因特网域名的形式进行定义。
- 在进行命名包时,应该避免使用与系统发生冲突的名字。
- 一个源文件只能有一个package语句,放在源文件第一行,import语句前。
- 自定义包可以以java开头。
编译和运行
一、编译带包的类:
javac -d 目录 源文件名.java
注:在使用命令javac –d 之前,必须先创建好包路径,因为该命令不会自动创建文件夹。
二、运行带包的类:
java 包名.类名
使用包
同个包的类之间访问比较简单,在代码中直接使用类名;而不同包之间的访问则必须满足一个条件:一个类如果希望被其他包中的类访问, 那么必须加上public修饰(注意:用public修饰的类必须和源文件名同名)。
一、不同包之间的使用通常有以下3种方法:只能导入public修饰的类
- 使用全名访问类;
- import 该类;
- import 包含该类的整个包;
常用的包
- Java.lang包:java的核心类库,包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省(默认)加载这个包。
- java.util包:Java的实用工具类库。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。
- java.io包:java语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等。
- java.util.zip包:实现文件压缩功能。
- java.lang.reflect包:提供用于反射对象的工具。
- java.mah:如提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。
- java.net包:用来实现网络功能的类库。如Socket类、ServerSocket类。
- java.awt包:构建图形用户界面(GUI)的类库。提供的类如:低级绘图操作Graphics类,图形界面组件和布局管理如 Checkbox类、Container类、LayoutManager接口等,以及用户界面交互控制和事件响应,如Event类。
- java.awt.event包:GUI事件处理包。
- java.awt.image包:处理和操纵来自于网上的图片的java工具类库。
- java.sql包:实现JDBC的类库。
- java.applet包:编写java applet程序用的。
import
一、当导入的两个包中有相同的类名时,如果继续采用缩写,就会出现“The type xxx is ambiguous”问题。这时,你就要使用这个类的全名。比如,java.util、java.sql包中都有Date类,程序又同时导入了这两个包中的Date类。解决办法如下:
import java.sql.*;
import java.util.*;
import java.util.Date; //明确导入一下
二、静态导入,导入静态域和静态方法。
导入特定的静态域或静态方法
import static java.lang.Math.PI;
import static java.lang.Math.cos;
public class Test {
public static void main(String[] args) {
//以下几种调用方式都可以
double r = Math.cos(Math.PI * 2);//1.0
double r1 = Math.cos(PI * 2);//1.0
double r2 = cos(PI * 2);//1.0
}
}
导入全部的静态域和静态方法:
import static java.lang.Math.*;
过度使用静态导入会导致代码难以阅读和维护,因为阅读者不知道某个特定的静态对象是属于哪个类的。 但恰当地使用静态导入,代码可以因为不用繁琐地写全名而更具可读性。