我们的第一个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(); 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://www.java.sun.com下载,或用其他方法安装了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()是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可汇报我们与内存利用有关的信息。