![On Java:中文版·基础卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/337/53256337/b_53256337.jpg)
3.8 你的第一个Java程序
现在,你终于迎来了编写第一个完整程序的时刻。该程序运行时将显示一个字符串,以及一个通过Java标准库的Date类所生成的日期。
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_74_01.jpg?sign=1739573029-OqMxVcy7bQCa8U1gCm8NRPUeK7ytJMAT-0-d4a80884fb7630ba386dcdbb1f77017e)
在本书的代码示例中,第一行代码都具有特别的作用:显示文件夹路径(比如本章的文件夹名为objects)以及文件名的一行注释。我使用自动化工具来提取和测试本书中符合上述条件的代码。此外,通过第一行代码注释,你也可以很方便地在库里[8]找到对应的源代码。
在每一个程序文件的起始处,你都必须使用import语句将所有额外的类导入到文件中。这里说“额外”是因为,所有Java文件都会自动导入一个特定的库,即java.lang。你可以打开浏览器在Oracle网站上查看这个库的文档,如果你还没有下载JDK文档,现在就可以去Oracle公司的Java网站下载[9],或者通过互联网搜索和查看。然后,如果你查看包的列表,会看到各种类的库。比如,你可以选择java.lang,你会看到一个呈现了该库所有类的列表。由于所有的Java代码文件都默认导入了java.lang,所以列表中的类我们都可以直接调用。另外,由于java.lang并不包含Date类,这就意味着你必须从其他库将其导入后才能使用。如果你不知道一个特定的类属于哪个库,或者说你想查看所有的类,可以点击Java文档页面的“Tree”按钮,页面会显示Java中所有的类供你查询。然后,你就可以通过浏览器的查找功能来找到Date类。比如,你会在页面列表中找到java.util.Date,这意味着Date类包含在util库中。因此,你必须在Java文件中添加一行代码import java.util.*,然后才可以使用Date类。
如果你在文档页面选择了java.lang然后查看其中的System类,会发现System类拥有几个字段。如果你选择了其中一个字段out,会发现这是一个static PrintStream对象。正因为它是static字段,所以你无须借助new关键字。也就是说,out对象会一直存在,你直接使用就行了。out对象的用途取决于它的类型,即PrintStream。此外,你会发现文档描述中的PrintStream是一个超链接,可以点击该超链接来查看PrintStream都提供了哪些方法为我们所用。其中包含的方法数量还不少,我们会在后续章节中陆续提及。现在需要的是println()方法,其作用是“在控制台打印我发送给你的内容,然后另起一行”。因此,如果你需要在控制台显示一段信息,可以在Java程序中编写如下代码:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_01.jpg?sign=1739573029-BeIsx32CHFaEhiPHWS9PWJlBKl5kcA09-0-f51fc20c31a7a937c611815853dad358)
需要注意的是,文件中必须存在一个与该文件同名的类(如果你没有这么做,则编译器会报错)。此外,如果你需要创建一个能够独立运行的程序,那么与文件同名的类中还必须包含一个程序启动的入口方法。这个特殊的方法叫作main(),具有以下的格式和返回值:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_02.jpg?sign=1739573029-1449ybzInYyLXe7lLx5P5NO7WujC1ATO-0-fc6191d0c7b340f5908670a0c437d21d)
public关键字代表这个方法可以被外部程序所调用(相关详细内容会在第7章中进行介绍)。main()的参数是一个String对象的数组,虽然目前我们并不会使用args参数,但Java编译器会强制你传递该参数,因为它用于获取控制台的输入。
下面的代码将打印当前的日期:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_03.jpg?sign=1739573029-yET20mAD4jkch2jOlDSHVEaYTf2SeKNA-0-27924b1a0ae68e50dcc2567f150a284f)
在这段代码中,我们创建了一个作为参数的Date对象,并将它的值传递给println()方法。而当这一段语句执行完毕时,Date对象就没用了,因此垃圾收集器可以随时清理它,而我们则无须关心这种清理工作。
当你查看JDK文档时,会发现System类包含了许多实用的方法(Java的重要资产之一就是内容极为丰富的标准库),比如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_04.jpg?sign=1739573029-PUVE3OWBqZZ4MFGxJavB0bu9Hpsx8NYQ-0-971c53d61897811e4447d15e3e56a696)
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_76_01.jpg?sign=1739573029-cSuMJKOPucCmKcrRD0uItRrfpQee2sQa-0-ad03ac796c8eeb043e61b18784f75982)
main()方法的第一行用于展示运行此程序的操作系统的所有属性,即操作系统的环境信息,并通过list()方法将结果传递给参数System.out。你会在本书的后续内容中看到,你还可以将结果发送至任何地方,比如发送至一个文件。同时你也可以获取一个特定的属性,比如这里获取的是user.name以及java.library.path。
代码结尾处的/*输出:标签用于展示此文件的实际输出结果。本书的大多数示例会采用这种注释格式来展示其输出内容,这样也便于你查看代码的输出是否正确。此外,当编译器检查和执行代码之后,该标签还支持自动将输出内容同步至本书的代码示例。