友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第32章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




或方法(因为非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” 

 (类分级结构)。在Web 浏览器中,虽然要花不短的时间来建立这个结构,但可清楚找到与Java 配套提供的 

每一个类。随后,可用浏览器的“查找”(Find )功能搜索关键字“Date ”。经这样处理后,可发现我们的 

搜索目标以 java。util。Date 的形式列出。我们终于知道它位于util 库里,所以必须导入 java。util。*;否 

则便不能使用Date 。  

观察packages。html 文档最开头的部分(我已将其设为自己的默认起始页),请选择java。lang,再选 

System。这时可看到System 类有几个字段。若选择 out,就可知道它是一个static PrintStream 对象。由 

于它是“静态”的,所以不需要我们创建任何东西。out 对象肯定是 3,所以只需直接用它即可。我们能对这 

个out 对象做的事情由它的类型决定:PrintStream。PrintStream 在说明文字中以一个超链接的形式列出, 

这一点做得非常方便。所以假若单击那个链接,就可看到能够为PrintStream 调用的所有方法。方法的数量 

不少,本书后面会详细介绍。就目前来说,我们感兴趣的只有 println()。它的意思是“把我给你的东西打 

印到控制台,并用一个新行结束”。所以在任何Java 程序中,一旦要把某些内容打印到控制台,就可条件反 

射地写上System。out。println(〃内容〃)。  

类名与文件是一样的。若象现在这样创建一个独立的程序,文件中的一个类必须与文件同名(如果没这样 

做,编译器会及时作出反应)。类里必须包含一个名为main()的方法,形式如下:  

public static void main(String'' args) {  

其中,关键字“public”意味着方法可由外部世界调用(第5 章会详细解释)。main()的自变量是包含了 

String 对象的一个数组。args 不会在本程序中用到,但需要在这个地方列出,因为它们保存了在命令行调用 

的自变量。  

程序的第一行非常有趣:  

System。out。println(new Date());  

请观察它的自变量:创建Date 对象唯一的目的就是将它的值发送给 println()。一旦这个语句执行完毕, 

Date 就不再需要。随之而来的“垃圾收集器”会发现这一情况,并在任何可能的时候将其回收。事实上,我 

们没太大的必要关心“清除”的细节。  

第二行调用了System。getProperties() 。若用Web 浏览器查看联机用户文档,就可知道 getProperties()是 



                                                                                54 


…………………………………………………………Page 56……………………………………………………………

System 类的一个 static方法。由于它是“静态”的,所以不必创建任何对象便可调用该方法。无论是否存 

在该类的一个对象,static 方法随时都可使用。调用getProperties()时,它会将系统属性作为 Properties 

类的一个对象生成(注意Properties 是“属性”的意思)。随后的的句柄保存在一个名为p 的Properties 

句柄里。在第三行,大家可看到Properties 对象有一个名为 list()的方法,它将自己的全部内容都发给一 

个我们作为自变量传递的PrintStream 对象。  

main()的第四和第六行是典型的打印语句。注意为了打印多个String 值,用加号(+)分隔它们即可。然 

而,也要在这里注意一些奇怪的事情。在 String 对象中使用时,加号并不代表真正的“相加”。处理字串 

时,我们通常不必考虑“+”的任何特殊含义。但是,Java 的String 类要受一种名为“运算符过载”的机制 

的制约。也就是说,只有在随同String 对象使用时,加号才会产生与其他任何地方不同的表现。对于字串, 

它的意思是“连接这两个字串”。  

但事情到此并未结束。请观察下述语句:  

System。out。println(〃Total Memory = 〃  

+ rt。totalMemory()  

+ 〃 Free Memory = 〃  

+ rt。freeMemory());  

其中,totalMemory()和freeMemory ()返回的是数值,并非String 对象。如果将一个数值“加”到一个字串 

身上,会发生什么情况呢?同我们一样,编译器也会意识到这个问题,并魔术般地调用一个方法,将那个数 

值(int,float 等等)转换成字串。经这样处理后,它们当然能利用加号“加”到一起。这种“自动类型转 

换”亦划入“运算符过载”处理的范畴。  

许多Java 著作都在热烈地辩论“运算符过载”(C++的一项特性)是否有用。目前就是反对它的一个好例 

子!然而,这最多只能算编译器(程序)的问题,而且只是对 String 对象而言。对于自己编写的任何源代 

码,都不可能使运算符“过载”。  

通过为 Runtime 类调用 getRuntime()方法,main()的第五行创建了一个Runtime 对象。返回的则是指向一个 

Runtime 对象的句柄。而且,我们不必关心它是一个静态对象,还是由 new 命令创建的一个对象。这是由于 

我们不必为清除工作负责,可以大模大样地使用对象。正如显示的那样,Runtime 可告诉我们与内存使用有 

关的信息。  



2。8 注释和嵌入文档  



Java 里有两种类型的注释。第一种是传统的、C 语言风格的注释,是从 C++继承而来的。这些注释用一个 

 “/*”起头,随后
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!