7.2 引用包
接着上面的例子,将TestPackage.java调整为如下内容。
package com.bd.test;
public class TestPackage
{
public show()
{
System.out.println("package com.bd.test");
}
}
假设在当前目录(如图7.1所示的example1目录)下新建了一个Java程序TestImport1.java,在程序中需要新建一个TestPackage类的对象,并调用该对象的show()方法,代码如下。
class TestImport1
{
public static void main(String[] args)
{
TestPackage tp = new TestPackage();
tp.show();
}
}
编译时会提示错误,找不到TestPackage类。其原因在于,TestPackage这个类已经被打包到com\bd\test目录下,如果在TestImport1代码中不做任何操作,是找不到TestPackage类的。
7.2.1 完整类名引用类
引用不同包中的类有两种方法,其中一种非常直观的方法就是使用完整类名引用类。例如,将上面TestImport1类修改为如下的内容。
class TestImport2
{
public static void main(String[] args)
{
//使用完整包名引用包
com.bd.test.TestPackage tp = new com.bd.test.TestPackage();
tp.show();
}
}
编译并运行(运行前要将EditPlus的运行环境调整回本章之前的状态)程序,会正常地在控制台输出“package com.bd.test”。
7.2.2 导入包
使用完整类名引用类的方法虽然直观,但书写的内容多,且当使用的类比较多时,编辑和阅读都非常困难。接下来学习的是采用导入包的形式引用类,导入包的语法形式如下。
import 包名.类名;
这里的包名、类名既可以是JDK提供的包和类的名称,也可以是用户自定义的包名和类名。
如果要使用一个包中的某些类,可以使用import 包名.;的形式导入这个包中所有的类。不过,包的导入不是迭代的,就是说当导入java.util.时,只会导入java.util包中所有的公共类,不会导入这个包下其他文件夹中的类。
另外,import语句需要放在package语句后,在类定义之前。
例如,现在需要通过Java程序求出64的平方根。通过查询JDK API,找到java.lang.Math类有一个sqrt(double a)方法,返回a的平方根,则具体实现代码如下。
import java.lang.Math; //导入java.lang.Math类,可以省略
class TestImport3
{
public static void main(String[] args)
{
System.out.println("64的平方根为:" + Math.sqrt(64)); //使用Math类的sqrt方法
}
}
编译、运行程序,输出正确结果:8.0。
如果删除import java.lang.Math;这条语句后重新编译、运行,发现程序仍然可以正确输出8.0的结果。为什么呢?其因为在于,对于java.lang包中的所有公共类,系统都默认导入到程序中,不需要程序员显式地导入。
假设现在需要输出当前的日期和时间。通过查询JDK API,找到java.util.Date类有一个toString()方法,按一定的格式输出日期和时间,则具体实现代码如下。
import java.util.*; //导入java.util包中的所有公共类,不可以省略
class TestImport4
{
public static void main(String[] args)
{
Date now = new Date();
System.out.println("现在的日期为:" + now.toString()); //使用Date类的toString方法
}
}
程序运行结果如图7.6所示。
本小节的两个例子都是导入了JDK类库中的包,接下来修改7.2.1节中使用“完整类名引用类”的例子,采用导入包的形式引用类,具体代码如下。
import com.bd.test.*; //导入com.bd.test中所有的公共类
class TestImport5
{
public static void main(String[] args)
{
TestPackage tp = new TestPackage(); //直接使用导入的类
tp.show();
}
}