![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=1739598301-HhFXX7W8OE0zlRn6PX0fiyKtdlgAJi8y-0-c532212128c90336095171c9c9a569e8)
在本书的代码示例中,第一行代码都具有特别的作用:显示文件夹路径(比如本章的文件夹名为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=1739598301-cXGSWGwdJCbKC72WEYLsZNTKZgwPo7y6-0-58fa210d58e629095e59c7ace339bbb4)
需要注意的是,文件中必须存在一个与该文件同名的类(如果你没有这么做,则编译器会报错)。此外,如果你需要创建一个能够独立运行的程序,那么与文件同名的类中还必须包含一个程序启动的入口方法。这个特殊的方法叫作main(),具有以下的格式和返回值:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_02.jpg?sign=1739598301-sGqkUDwMEj1e7Bccgwa1RlZKJkw0a95c-0-df41609e849318fbee2b8abe56a5d400)
public关键字代表这个方法可以被外部程序所调用(相关详细内容会在第7章中进行介绍)。main()的参数是一个String对象的数组,虽然目前我们并不会使用args参数,但Java编译器会强制你传递该参数,因为它用于获取控制台的输入。
下面的代码将打印当前的日期:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_03.jpg?sign=1739598301-dhW4WQtmVJ0aidYcHJG6nwb4ROlkuPuw-0-19d32c9244836944d6349fde15b957ff)
在这段代码中,我们创建了一个作为参数的Date对象,并将它的值传递给println()方法。而当这一段语句执行完毕时,Date对象就没用了,因此垃圾收集器可以随时清理它,而我们则无须关心这种清理工作。
当你查看JDK文档时,会发现System类包含了许多实用的方法(Java的重要资产之一就是内容极为丰富的标准库),比如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_75_04.jpg?sign=1739598301-qFeGEeoG6QRAGVF5nqN80ZygHvhMYEHr-0-df48f6ffc4877193a9091fb4aabf0f2d)
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_76_01.jpg?sign=1739598301-ajN26IOOK9gpL4Skw3Dgq4yutYJ0oaL1-0-9b3bebd4a0f7cdfbbdfec15789a44a86)
main()方法的第一行用于展示运行此程序的操作系统的所有属性,即操作系统的环境信息,并通过list()方法将结果传递给参数System.out。你会在本书的后续内容中看到,你还可以将结果发送至任何地方,比如发送至一个文件。同时你也可以获取一个特定的属性,比如这里获取的是user.name以及java.library.path。
代码结尾处的/*输出:标签用于展示此文件的实际输出结果。本书的大多数示例会采用这种注释格式来展示其输出内容,这样也便于你查看代码的输出是否正确。此外,当编译器检查和执行代码之后,该标签还支持自动将输出内容同步至本书的代码示例。