一、Java 类包
1.1 类名冲突
Java 中每个接口或类都来自不同的类包,无论是 Java API 中的类与接口还是自定义的类与接口都需要隶属于某一个类包,这个类包包含了一些类和接口。如果没有包的存在,管理程序中的类名称将是一件非常麻烦的事,如果程序只由一个类定义组成,并不会给程序带来什么影响,但是随着程序代码的增多,难免会出现类同名的问题。例如,在程序中定义了个 Login 类,因业务需要,还要定义一个名称为 Login 的类,但是这两个类所实现的功能完全不同,于是问题就产生了,编译器不会允许存在同名的类文件。解决这类问题的办法是将这两个类放置在不同的类包中。
1.2 完整的类路径
eg java.lang.Math;
java.lang 包的名称
Math 类的名称
一个完整的类名需要包名与类名的组合,每个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效地避免同名类冲突的情况。例如,一个程序中同时使用到 java.util.Date 类与 java.sql.Date 类,如果在程序中不指定完整类路径,编译器不会知道这段代码使用的是 java.util 类包中的 Date 类还是 java.sql 类包中的 Date 类,所以需要在指定代码中给出完整的类路径。
eg :在程序中使用两个不同 Date 类的完整类路径
java.util.Date date = new java.util.Date();
java.sql.Date date2 = new java.sql.Date(233);
在 Java 中采用类包机制非常重要,类包不仅可以解决类名冲突问题,还可以在开发庞大的应用程序时,帮助开发人员管理庞大的应用程序组件,方便软件复用。
同一个包中的类相互访问时,可以不指定包名。
1.3 创建包
定义包名的语法:
package 包名;
在类中指定包名时需要将 package 表达式放置在程序的第一行,它必须是文件中的第一行非注释代码,当使用 package 关键字为类指定包名之后,包名将会成为类名中的一部分,预示着这个类必须指定全名。
Java 包的命名规则是全部使用小写字母。
eg :在项目中创建 Math 类,在创建类的对话框中指定包名为 com.ljs ,并在主方法中输出说明该类并非 java.lang 包的类。
package com.ljs; //指定包名
public class Math{
public static void main(String[] aegs){
System.out.println("不是 java.lang.Math 类,而是 com.ljs.Math 类");
}
}
运行结果:
不是 java.lang.Math 类,而是 com.ljs.Math 类
1.4 导入包
1.4.1 使用 import 关键字导入包
如果某个类需要使用 Math 类,那么可以使用 Java 中的 import 关键字指定。如果在程序中使用 import com.ljs 表达式,在程序中使用 Math 类时就会选择 com.ljs.Math 类来使用,当然也可以直接在程序中使用 Math 类时指定 com.ljs.Math 类。
import 关键字的语法:
import com.ljs.*; //指定 com.ljs 包中的所有类在程序中都可以使用
import com.ljs.Math; //指定 com.ljs 包中的 Math 类在程序中都可以使用
在使用 import 关键字时,可以指定类的完整描述,如果为了使用包中更多的类,可以使用 import 关键字指定时在包指定后加上 * ,这表示可以在程序使用包中的所有类。
如果类定义中已经导入 com.ljs.Math 类,在类体中在使用其他包中的 Math 类时则必须指定完整的带有包格式的类名,如这种在使用 java.lang 包中的 Math 类时就要使用全名格式 java.lang.Math 。
在程序中添加 import 关键字时,就开始在 CLASSPATH 指定的目录中进行查找,查找子目录 com.ljs ,然后从这个目录下编译完成的文件中查找是否有名称符合者,最后寻找到 Math.class 文件。另外,当使用 import 指定了一个包中的所有类时,并不会指定这个包的子包中的类,如果用到这个包中的子类,需要再次对子包作单独引用。
在 Java 中将 Java 源文件与类文件放在一起管理是极为不好的管理方式。可以在编译时使用 -d 参数设置编译后类文件产生的位置。使用 DOS 进入程序所在的根目录下,执行如下命令:
javac -d ./bin/ ./com/ljs/*.java
这样编译成功后将在当前运行路径下的 bin 目录中产生 com/ljs 路径,并在该路径下出现相应源文件的类文件。如果使用 Eclipse 编译器,并在创建项目时设置了源文件与输出文件的路径,编译后的类文件会自动保存在输出文件的路径中。
如果不能再程序所在根目录下使用 javac.exe 命令,注意在 path 环境变量中设置 Java 编译器所在的位置,假如是 C:\Java\jdk 1.6.0_03\bin ,可以使用 set path=C:\Java\jdk 1.6.0_03\bin;%path% 命令在 DOS 中设置 path 环境变量。
1.4.2 使用 import 导入静态成员
import 关键字除了导入包之外,还可以导入静态成员。
import 导入静态成员的语法:
import static 静态成员;
eg : 在项目中创建 ImportTest 类,在该类中使用 import 关键字导入静态成员。
package com.ljs;
import static java.lang.Math.max;//导入静态成员方法
import static java.lang.System.out;//导入静态成员变量
public class ImportTest{
public static void main(Stirng[] args){
//在主方法中可以直接使用这些静态静态成员
out.println("1 和 4 的较大值为:" + max(1,4));
}
}
运行结果为:
1 和 4 的较大值为:4
非标使用 import static 导入了 java.lang.Math 类中的静态成员方法 max() 和 java.lang.System 类中的 out 成员变量,这时就可以在程序中直接饮用这些静态成员,如在主方法中的 out.println() 表达式以及直接使用 max() 方法。