上一篇文章介绍了Java工程的帝国区划,末尾给出了一段Java代码例子,这个代码虽然勉强能看懂,但是有些细节令人不甚了了。比如说“// 参观朱雀台”为何能够直接跟在当前行后面?“System.out.println”又为何被点号绕了三道湾?显然这里面必定有一些规则需要遵守,好比到了一个国家就要入乡随俗,为了方便游客更好更快地适应当地的风俗,Java帝国特别设立了几个特殊官职,专门负责对内对外打交道的事情。其中有几个官吏经常露面,尤其需要初学者注意,他们是:翻译官、太史公、贸易官,接下来分别介绍如何与它们打招呼。
翻译官
Java代码其实由一行一行的符号组成,跟通俗易懂的自然语言没法比,因为Java只是一种计算机编程的高级语言,它的代码逻辑是给电脑看的,不是给普通人看的,所以初学者不要指望马上就能看懂Java代码。到了异国他乡,面对周围的鸟语叽喳,啥都听不懂可不是办法,最好能找个翻译,把这群老外说的鸟语翻译成你我熟知的母语,这样才好待下来学习和生活。Java帝国里面也有类似的翻译官,大名叫做“注释”,意思就是在代码里添加一行或者一段说明性的文字,这些说明文字对程序运行不起任何作用,仅仅是方便初学者理解Java代码的功能作用。
像前面代码里面的“// 参观朱雀台”,开头的两个双斜杆“//”便是注释的标记符号,它表示当前行在双斜杆之后的内容都属于注释文字,可以随便写开发者的母语文本,反正不会影响Java程序的编译和运行。双斜杆的注释规则有两条,其一为:它只注释后面的文字,不注释前面的文字;其二为:它只对当前行有效,对上一行和下一行都是无效的。因此,如果要添加多行的说明文字,就得在每行文字开头都加上双斜杆符号。下面是给Java代码添加多行注释的例子:
// 先参观朱雀台 // 再参观金虎台 // 最后参观冰井台
然而每行文字前面都要开发者手工输入双斜杆,实在是有点兴师动众,为减少开发者的工作量,有两个办法可以避免重复的手工输入。第一个办法,先用鼠标选中需要注释的数行文本,再依次选择Eclipse顶部菜单的“Source”→“Toogle Comment”,此时Eclipse瞬间在这几行文字开头都加上了双斜杆。第二个办法,是采用Java代码的多行注释标记,这个多行注释,需要一个标记头和一个标记尾,那么夹在头尾标记中间的文字,即为被注释了的文本内容了。所谓的标记头,由符号“/*”组成,而标记尾则由符号“*/”组成,二者之间可以有单行文字,也可以有多行文字。如果头尾标记包括注释文字都在同一行,那么该行的完整注释形如“/* 这里是注释文字 */”。如果头尾标记连同注释文字分散成多行排列,那么完整的多行注释格式是下面这种形式:
/* 先参观朱雀台 再参观金虎台 最后参观冰井台 */
注释标记与说明文本之间的空格没有实际意义,仅仅是看过去显得不那么拥挤罢了。由于双斜杆表达的注释一般言简意赅,不会太啰嗦,因此本系列的文章主要采取双斜杆对说明文字加以注释。
太史公
程序员写完代码之后,运行程序之时经常要检查运行过程是否符合预期,这就要求程序能够自动汇报运行情况,以便开发者事后分析整个运行过程的经过。或者说,小到一个人每天写日记,大到一个国家编史书,总之该工作好比史官(又称太史公)辛勤地记载各类史实,计算机程序的史料学名就称作“日志”。程序把自身的运行信息输出到控制台(Console窗口)或者输出到文件中,便构成了程序的运行日志。最简单的日志输出代码如下所示:
System.out.println("欢迎来到魏国的都城——邺城。");
从以上代码可见,输出日志的方法是“System.out.println”,最前面的System表示这里在进行系统操作,中间的out表示向控制台输出信息;最后面的println表示打印括号内的文本,并跳到下面一行,末尾的ln是line的缩写。如果把最后面的println改成print,那么打印完括号内的文本之后,当前定位在该行文本的末尾,而不会跳到下一行的开头。下面演示看看println和print区别,先用System.out.println打印两句话,代码示例如下:
System.out.println("欢迎来到魏国的都城——邺城。"); System.out.println("这里是邺城的正南门——凤阳门。");
此时控制台输出的日志信息如下图所示:
再用System.out.print打印同样的两句话,代码示例如下:
System.out.print("欢迎来到魏国的都城——邺城。"); System.out.print("这里是邺城的正南门——凤阳门。");
此时控制台输出的日志信息如下图所示:
由此可见,通过println打印的日志内容是分行显示的,而通过print打印的日志都显示在同一行。
既然调用System.out可以往控制台输出日志,那么反过来,调用System.in也可以从控制台向程序输入信息。只不过输入文字的接收要分以下两个步骤:
1、创建一个控制台的扫描器,随时盯着控制台的输入操作,扫描器的创建代码如下所示:
Scanner scan = new Scanner(System.in); // 从控制台接收输入文本
2、通过扫描器的nextLine方法获得一行输入文字,按下回车键表示该行文字输入完毕。
下面举个从控制台获取输入信息的例子,曹操任命张辽镇守合肥,而孙权亲率大军进攻合肥,张辽在逍遥津之战中杀得东吴众将丢盔弃甲。现在往控制台输入向张辽挑战的吴国将领姓名,看看都有谁前来应战,完整的代码示例如下:
package com.donghan.huainan.hefei; // 东汉帝国淮南郡合肥县 import java.util.Scanner; public class Hefei { public static void main(String[] args) { System.out.print("这里是张辽镇守的合肥城,吴国谁来挑战?"); Scanner scan = new Scanner(System.in); // 从控制台接收输入文本 /* nextLine方法表示接收一行文字,以回车键结尾 */ System.out.println("吴国前来挑战的将领是:"+scan.nextLine()); } }
接着通过右键菜单“Run As”→“Java Application”运行Hefei程序,并在控制台敲入“甘宁”,然后按下回车键。键盘输入前后的控制台截图如下所示,可见程序成功读取到了控制台的输入文字。
贸易官
帝国物产丰盈,各地都有闻名遐迩的土特产,比如曹操南征宛城张绣,结果反遭张绣暗算,致使大将典韦阵亡,这个宛城便是汉代最大的冶铁中心。此外,蜀汉的成都平原盛产蜀锦,而东吴的景德镇则盛产陶瓷。既然各地出产多种多样,不妨互通有无,大家做个贸易,你卖你的,我卖我的,各取所需,皆大欢喜。这个进出口贸易,就由专门的贸易官来掌管。贸易官既负责出口商品,也负责进口商品。对于出口贸易来说,需要区分哪些地方是对外开放城市,又有哪些货物是允许出口的普通商品。
对外开放在Java代码中使用关键字public来表达,凡是被public前缀修饰了的城池,都是对外开放城市,凡是被public前缀修饰了的东西,都是允许出口的货物。譬如下面的代码例子,指定了宛城是座对外开放城市,并且当地出产的铁器也是可供出口的货物。
package com.donghan.nanyang.wanxian; // 东汉帝国南阳郡宛县 public class Wancheng { public static void getIron() { System.out.println("从宛城得到了一大批的铸铁兵器。"); } public static void main(String[] args) { System.out.println("欢迎来到大汉的冶铁中心——宛城。"); } }
现在其它地方想要进口宛城的铁器,就得通过贸易官开展进口贸易。贸易官首先通过关键字import说明将要从某地进口商品,就像如下代码这般表示:
import com.donghan.nanyang.wanxian.Wancheng; // 准备从宛城进口商品
然后在具体运行的代码段中添加来自Wancheng(宛城)的贸易进口代码。再举个例子,想当年关羽大举北伐,消息传到襄阳,曹军主将曹仁赶忙从宛城进口了一批铁质兵器,意图加强军备抵抗蜀军。这样的话,Xiangyang(襄阳)这个地方,需要声明import(进口)来自Wancheng(宛城)的铁器。于是完整的Xiangyang城代码如下所示:
package com.donghan.nanjun.xiangyang; // 东汉帝国南郡襄阳县 import com.donghan.nanyang.wanxian.Wancheng; // 准备从宛城进口商品 public class Xiangyang { public static void main(String[] args) { System.out.println("这里是华夏第一城池——襄阳城。"); Wancheng.getIron(); // 开展从宛城进口铁器的贸易 } }
最后仍旧通过右键菜单“Run As”→“Java Application”运行Xiangyang程序,程序运行结果如下图所示。
可见Wancheng(宛城)的铁器被进口到了Xiangyang(襄阳),用编程的专业术语来说,是Xiangyang这个类调用了Wancheng那个类的getIron方法。