按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
一个程序,但在创建它的时候,却向自己的库加入了一个新类,它与现有某个类的名字发生了冲突。
为解决这个问题,必须消除所有潜在的、纠缠不清的情况。为达到这个目的,要用 import 关键字准确告诉
Java 编译器我们希望的类是什么。import 的作用是指示编译器导入一个“包”——或者说一个“类库”(在
其他语言里,可将“库”想象成一系列函数、数据以及类的集合。但请记住,Java 的所有代码都必须写入一
个类中)。
大多数时候,我们直接采用来自标准Java 库的组件(部件)即可,它们是与编译器配套提供的。使用这些组
件时,没有必要关心冗长的保留域名;举个例子来说,只需象下面这样写一行代码即可:
import java。util。Vector;
它的作用是告诉编译器我们想使用 Java 的Vector 类。然而,util 包含了数量众多的类,我们有时希望使用
其中的几个,同时不想全部明确地声明它们。为达到这个目的,可使用“*”通配符。如下所示:
import java。util。*;
需导入一系列类时,采用的通常是这个办法。应尽量避免一个一个地导入类。
2。6。3 static 关键字
通常,我们创建类时会指出那个类的对象的外观与行为。除非用new 创建那个类的一个对象,否则实际上并
未得到任何东西。只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无
论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任
何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用
static (静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一
起。所以尽管从未创建那个类的一个对象,仍能调用一个 static方法,或访问一些 static数据。而在这之
52
…………………………………………………………Page 54……………………………………………………………
前,对于非 static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非
static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何
对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非 static成员
或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了“类数据”和“类方法”这两个术语。它们意味着数据和方法只是为作为一个整
体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些Java 书刊里发现这样的称呼。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个 static
数据成员,并对其初始化:
class StaticTest {
Static int i = 47;
}
现在,尽管我们制作了两个StaticTest 对象,但它们仍然只占据StaticTest。i 的一个存储空间。这两个对
象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论 st1。i还是 st2。i都有同样的值 47,因为它们引用的是同样的内存区域。
有两个办法可引用一个 static变量。正如上面展示的那样,可通过一个对象命名它,如 st2。i。亦可直接用
它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用 static 变量,因为它强调了那个变量
的“静态”本质)。
StaticTest。i++;
其中,++运算符会使变量增值。此时,无论 st1。i 还是 st2。i 的值都是48。
类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法
格式“类名。方法()”加以引用。静态方法的定义是类似的:
class StaticFun {
static void incr() { StaticTest。i++; }
}
从中可看出,StaticFun 的方法 incr()使静态数据 i增值。通过对象,可用典型的方法调用 incr():
StaticFun sf = new StaticFun();
sf。incr();
或者,由于 incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun。incr();
尽管是“静态”的,但只要应用于一个数据成员,就会明确改变数据的创建方式(一个类一个成员,以及每
个对象一个非静态成员)。若应用于一个方法,就没有那么戏剧化了。对方法来说,static一项重要的用途
就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的——特
别是在定义程序运行入口方法main()的时候。
和其他任何方法一样,static方法也能创建自己类型的命名对象。所以经常把 static方法作为一个“领头
羊”使用,用它生成一系列自己类型的“实例”。
2。7 我们的第一个 Java 程序
最后,让我们正式编一个程序(注释⑤)。它能打印出与当前运行的系统有关的资料,并利用了来自Java 标
准库的 System 对象的多种方法。注意这里引入了一种额外的注释样式:“//”。它表示到本行结束前的所有
内容都是注释:
// Property。java
import java。util。*;
public class Property {
public static void main(String'' args) {
System。out。println(new Date());
Properties p = System。getProperties();
53
…………………………………………………………Page 55……………………………………………………………
p。list(System。out);
System。out。println(〃……Memory Usage:〃);
Runtime rt = Runtime。getRuntime();
System。out。println(〃Total Memory = 〃
+ rt。totalMemory()
+ 〃 Free Memory = 〃
+ rt。freeMemory());
}
}
⑤:在某些编程环境里,程序会在屏幕上一切而过,甚至没机会看到结果。可将下面这段代码置于 main()的
末尾,用它暂停输出:
try {
Thread。currentThread()。sleep(5 * 1000);
} catch(InterruptedException e) {}
}
它的作用是暂停输出5 秒钟。这段代码涉及的一些概念要到本书后面才会讲到。所以目前不必深究,只知道
它是让程序暂停的一个技巧便可。
在每个程序文件的开头,都必须放置一个 import 语句,导入那个文件的代码里要用到的所有额外的类。注意
我们说它们是“额外”的,因为一个特殊的类库会自动导入每个Java 文件:java。lang。启动您的Web 浏览
器,查看由 Sun 提供的用户文档(如果尚未从 http://java。sun。 下载,或用其他方式安装了Java 文
档,请立即下载)。在 packages。html 文件里,可找到Java 配套提供的所有类库名称。请选择其中的
java。lang。在“Class Index”下面,可找到属于那个库的全部类的列表。由于 java。lang 默认进入每个
Java 代码文件,所以这些类在任何时候都可直接使用。在这个列表里,可发现System 和 Runtime,我们在
Property。java 里用到了它们。java。lang 里没有列出 Date 类,所以必须导入另一个类库才能使用它。如果
不清楚一个特定的类在哪个类库里,或者想检视所有的类,可在Java 用户文档里选择“Class Hierarchy”
(类分级结构)