《Java核心技术卷Ⅰ》读书笔记——4.7 包
为了保证包名的绝对唯一性,Sun公司建议将公司的因特网域名以逆序的形式作为包名,例如:com.xxxx
从编译器的角度看,嵌套的包之间没有任何关系,例如,java.util包与java.util.jar包毫无关系,每一个包都拥有独立的类集合。
4.7.1类的导入
一个类可以使用所属包中的所有类,以及其他包中的公用类。我们可以采用两种方式访问另一个包中的公有类。
第一种:java.time.LocalDate today = java.time.LocalDate.new();
第二种:import java.time.*; 或者import java.time.LocalDate;
java.time.*的语法比较简单,对代码的大小也又没有任何负面影响。当然,如果能够明确地指出所导入的类,代码可读性更高。
当导入的两个包中有类重名时(例如java.util和java.sql包中都有Date类)。可以增加一个特定的import语句:
import java.util.*;
import java.sql.*;
import java.util.Date;
如果两个包中的Date类都需要使用,则只能在每个类名前加上完整的包名了。
4.7.2 静态导入
import语句还可以导入静态方法和静态域。
例如,import static java.lang.System.*;
就可以直接使用System类的静态方法和静态域,而不需要加上类名前缀:
out.println("Hello World!");
exit(0);
另外还可以导入特定的方法或域:
import static java.lang.System.out;
实际上,这种简写形式不利于代码的清晰度。不过,
sqrt(pow(x, 2), pow(y, 2));
就看起来比
Math.sqrt(Math.pow(x, 2), Math.pow(y, 2));
清晰很多。
4.7.3 将类放入包中
如果源文件开头没有放置package语句,这个源文件中的类就被放置在一个默认包(default package)中。默认包是一个没有名字的包。
将包中的文件放到与完整的的包名匹配的子目录中。例如,com.horstmann.corejava包中的所有源文件应该被放置在子目录com\horstmann\corejava(windows)中。编译器将类文件也放在相同的目录结构中。
程序清单4-6与4-7的程序分别放在两个包中:PackageTest类放置在默认包中;Employee类放在com.horstmann.corejava包中。文件目录结构如下:
要想编译这个程序,只需改变基目录,并运行命令
javac PackageTest.java
编译器会自动查找文件com\horstmann\corejava\Employee.java并进行编译。
下面看一个更加实际的例子。
在这种情况下,仍然要从基目录(包名的上一级目录)编译和运行类,即包含com目录:
javac com\mycompany\PayrollApp.java
java com.mycompany.PayrollApp
需要注意,编译器对文件(带有文件分隔符和扩展名.java的文件)进行操作,而java解释器加载类(带有.分隔符)。