现在,你终于迎来了编写第一个完整程序的时刻。该程序运行时将显示一个字符串,以及一个通过 Java 标准库的 Date 类所生成的日期。

  1. // objects/HelloDate.java
  2. package objects
  3. import java.util.*;
  4. public class HelloDate {
  5. public static void main(String[] args) {
  6. System.out.println("Hello, it's: ");
  7. System.out.println(new Date());
  8. }
  9. }

在本书的代码示例中,第一行代码都具有特别的作用:显示文件夹路径(比如本章的文件夹名为 objects)以及文件名的一行注释。我使用自动化工具来提取和测试本书中符合上述条件的代码。此外,通过第一行代码注释,你也可以很方便地在库里8找到对应的源代码。

8地址是 https://github.com/BruceEckel/OnJava8-Examples

在每一个程序文件的起始处,你都必须使用 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 类。

9需要注意的是,JDK默认没有包含文档,所以你需要单独下载它。

如果你在文档页面选择了 java.lang 然后查看其中的 System 类,会发现 System 类拥有几个字段。如果你选择了其中一个字段 out,会发现这是一个 static PrintStream 对象。正因为它是 static 字段,所以你无须借助 new 关键字。也就是说,out 对象会一直存在,你直接使用就行了。out 对象的用途取决于它的类型,即 PrintStream。此外,你会发现文档描述中的 PrintStream 是一个超链接,可以点击该超链接来查看 PrintStream 都提供了哪些方法为我们所用。其中包含的方法数量还不少,我们会在后续章节中陆续提及。现在需要的是 println() 方法,其作用是“在控制台打印我发送给你的内容,然后另起一行”。因此,如果你需要在控制台显示一段信息,可以在 Java 程序中编写如下代码:

  1. System.out.println("A String of things");

需要注意的是,文件中必须存在一个与该文件同名的类(如果你没有这么做,则编译器会报错)。此外,如果你需要创建一个能够独立运行的程序,那么与文件同名的类中还必须包含一个程序启动的入口方法。这个特殊的方法叫作main(),具有以下的格式和返回值:
public static void main(String[] args){}
public 关键字代表这个方法可以被外部程序所调用(相关详细内容会在第7章中进行介绍)。main() 的参数是一个 String 对象的数组,虽然目前我们并不会使用 args 参数,但 Java 编译器会强制你传递该参数,因为它用于获取控制台的输入。
下面的代码将打印当前的日期:
System.out.println(new Date());
在这段代码中,我们创建了一个作为参数的 Date 对象,并将它的值传递给 println() 方法。而当这一段语句执行完毕时,Date 对象就没用了,因此垃圾收集器可以随时清理它,而我们则无须关心这种清理工作。
当你查看 JDK 文档时,会发现 System 类包含了许多实用的方法(Java 的重要资产之一就是内容极为丰富的标准库),比如:

// objects/ShowProperties.java

public class ShowProperties {
  public static void main(String[] args) {
    System.getProperties().list(System.out);
    System.out.println(System.getProperty("user.name"));
    System.out.println(
      System.getProperty("java.library.path"));
  }
}
/* 输出(前20行):
-- listing properties --
java.runtime.name=OpenJDK Runtime Environment
sun.boot.library.path=C:\Program Files\OpenJDK\java-
se-8u41...
java.vm.version=25.40-b25
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=OpenJDK Client VM
file.encoding.pkg=sun.io
user.script=
user.country=US
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine
Specification
user.dir=C:\Git\OnJava8\ExtractedExamples\objects
java.runtime.version=1.8.0_41-b04
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\OpenJDK\java-
se-8u41...
os.arch=x86
java.io.tmpdir=C:\Users\Bruce\AppData\Local\Temp\
                  ...
*/

main() 方法的第一行用于展示运行此程序的操作系统的所有属性,即操作系统的环境信息,并通过 list() 方法将结果传递给参数 System.out。你会在本书的后续内容中看到,你还可以将结果发送至任何地方,比如发送至一个文件。同时你也可以获取一个特定的属性,比如这里获取的是 user.name 以及 java.library.path。
代码结尾处的 /* 输出:标签用于展示此文件的实际输出结果。本书的大多数示例会采用这种注释格式来展示其输出内容,这样也便于你查看代码的输出是否正确。此外,当编译器检查和执行代码之后,该标签还支持自动将输出内容同步至本书的代码示例。

编译和运行

为了能够编译和运行本书中的程序,你必须搭建好 Java 编程环境,其安装过程在第 2 章有详细的介绍。如果你遵从了指引的步骤,你使用的应该是从 Oracle 网站上免费获取的 Java 开发者工具集(Java Developer’s Kit, JDK)。如果你使用其他的开发系统,请查看该系统的说明文档以便可以正确编译和运行相关程序。
此外,第 2 章也介绍了如何安装本书的代码示例。安装完成后,请打开名为 objects 的子目录并通过命令行输入:
javac HelloDate.java
这一行代码应该不会输出任何内容。如果你看到了报错消息,就意味着你没有正确安装JDK,那么你需要调查问题原因并解决它。
如果命令行没有报错,那么你可以输入:
java HelloDate
结果就是,你会看到当前日期输出到了控制台。
这就是编译和运行本书所有(包括 main() 方法的)程序的过程10。另外,本书源代码的根目录里还包含了一个叫作 build.gradle 的文件,此文件包含了自动化构建、测试以及运行本书代码文件的 Gradle 的配置。当你初次运行 gradlew 命令时,Gradle 会被自动安装(前提是你已经安装了 Java)。

10你可能需要设置 CLASSPATH 参数,以便能够通过命令行编译和运行本书的所有程序。

创建一个简单的 java 文件

image.png

class Study {

    public static void main(String[] args){
        System.out.println("HelloWorld");
        System.out.println("加油!!!");
    }

}

在Study.java所在目录下运行cmd命令执行javac -encoding UTF-8 Study.java,将java文件编译成class文件,因为java默认字符集是GBK,如果java代码中包含中文字就要指定UTF-8字符集
image.png
同目录下就会生成对应的Study.class文件
image.png
输入java Study就可以执行java代码,main()方法是java程序的主入口,要有此方法java代码才能正常执行
记住:执行java代码要是全类名,如果Study的全类名是com.web.Study,那执行代码如下
java com.web.Study
image.png
如果有多个java文件是放在不同的文件夹中,就需要在基目录中进行编译和运行类,例如:
image.png
image.png
目录:com\horstman\corejava和com\mycompany。windows系统是”\”,linux是”/“
编译:javac com/mycompany/PayrollApp.java
执行:java com.mycompany.PayrollApp

反编译代码

指令:javap -c Study.class,通过反编译可以看到代码的具体执行过程
image.png
image.png