1.7 第一个程序

img

扫码看视频

1.7.1 了解JDK

要开发Java程序,我们离不开JDK,JDK包含了开发一个Java程序所需要的所有基本工具。下面我们来了解一下JDK安装目录下的文件和文件夹,如图1-8所示。

img

图1-8 JDK安装目录下的文件和文件夹

docs目录是我们在1.4.3节下载的JDK帮助文档,我们将其放到了JDK的安装目录下,JDK本身是不带这个文件夹的。

bin目录中包含了JDK中的可执行程序,如图1-9所示。其中,最常用的两个程序是javac.exe和java.exe,javac.exe是Java编译器,它负责把Java源程序编译为JVM可执行的字节码。java.exe是Java的解释器,当我们需要执行一个Java程序时,就要使用java.exe了。

img

图1-9 bin文件夹中的可执行程序

其他文件夹我们暂时不需要去了解,未来估计你也用不上。

1.7.2 编写第一个Java程序

下面编写第一个Java程序。

首先寻找一个能存放Java程序的文件夹,在该文件夹下新建一个文本文档,并将其改名为:Hello.java(我们称之为Java源文件)。然后使用文本编辑工具(如记事本、UltraEdit等)进行编辑。Java源程序与C/C++源程序类似,它们都是纯文本文件。

题外话 至于编写Java程序的文本编辑器,读者可以根据自己的喜好选择一个即可。不过像Word、写字板这种带文档样式功能的字处理软件就不合适了。

用文本编辑器打开Hello.java,输入代码1.1。

img

类是Java程序的基本编码单元,所以在Hello.java中,我们使用class关键字定义了一个名为Hello的类,这个类目前什么代码也没有。

接下来,我们来编译一下Hello.java这个源文件。打开命令提示符工具,进入Hello.java所在的文件夹。在第1.7.1节,我们介绍了javac.exe是Java的编译器,在命令提示符窗口中输入javac Hello.java。

这时出现错误提示:“'javac'不是内部或外部命令,也不是可运行的程序”,如图1-10所示。看来,我们不能直接输入javac来编译Java源程序了。换一种方法,输入javac.exe文件的完整路径,在笔者的机器上,javac.exe位于D:\Java\jdk-11.0.7\bin文件夹下,于是我们输入:

img

这次编译成功了。

img

图1-10 编译Hello.java出错了

在Hello.java文件编译之后,编译器会生成一个Hello.class的文件,这个文件就是Hello类的字节码文件,如图1-11所示。

img

图1-11 编译后生成Hello.class文件

下面我们用java.exe来运行一下这个Hello程序,在命令提示符窗口中输入:

img

注意:java.exe执行的是Java类,也就是我们编译后的Hello类,但不要添加.class后缀名。

结果如图1-12所示。

img

图1-12 运行Hello程序报错

错误提示指出“在类Hello中找不到main方法”。接触过C语言的读者可能会想到C语言中经典的入门示例“Hello World”,在这个示例中,有一个main函数,作为程序的入口函数。没错,在Java程序中也需要有一个main方法,作为程序的入口方法。接下来修改一下Hello.java文件,如代码1.2所示。

img

System.out.println()方法会在控制台窗口中输出方法参数的字符串值,并输出一个换行符。

然后,我们按照前述方法编译Hello.java,执行java Hello,结果如图1-13所示。

img

图1-13 运行结果

这就是一个Java版本的“Hello World”。读者暂时不用去理会这些代码的具体含义,只需要先感受一下Java程序的编写、编译和运行的过程即可。

初学者有时候可能会疏忽,把“D:\Java\jdk-11.0.7\bin\java Hello”错误地输入成了:“D:\Java\jdk-11.0.7\bin\java hello”。当出现这种情况时,Java解释器会有何反应呢?让我们来看图1-14。

img

图1-14 执行小写的hello类报错

当我们忽略Hello类的大小写时,Java解释器会报告“找不到hello类”,我们在Hello.java中定义的类名是Hello,而java.exe程序接收的参数是类的名称而不是一个文件名。由于Java对大小写非常敏感,Hello类与hello类是两个不同的类,所以在执行hello类时会出现无法找到类的错误。因此,读者一定要注意类名称的大小写,以免出现上述的错误。

接下来,我们在Hello.java中再加入一些代码,如代码1.3所示。

img
img

粗体显示的代码是新增的。

至此,我们在Hello.java中已经定义了两个类:Hello和Welcome。再次使用javac编译Hello.java,你会发现此时在程序所在的文件夹下生成了两个.class文件。由此,我们可以推断出,Java编译器会把每个类的编译结果单独放到一个.class文件中,如图1-15所示。

img

图1-15 编译生成两个.class文件

我们在编写Java程序时,可以在一个.java文件中编写多个类,Java编译器会把不同的类编译到不同的.class文件中。不过在使用java.exe运行Java程序时,需要执行的是有main方法所在的类。针对本例,执行的是Hello类而不是Welcome类。

修改代码1.3,在Welcome类的class关键字前面添加一个public修饰符,如代码1.4所示。

img

再次编译Hello.java,你会看到如图1-16所示的错误。

img

图1-16 public类名与文件名不符错误

这是因为,Java要求:当一个类声明为public时,那么该类所在的文件名必须与类名相同。由于Welcome类现在声明为public,而文件名是Hello.java,类名与文件名不符,所以在编译时就提示了错误。

将文件Hello.java的名字修改为Welcome.java,编译Welcome.java,此时一切正常。那么一个Java源文件中能否存在两个public类呢?显而易见,这肯定是不行的,如果允许存在两个public类,那么文件名就不知道该用哪个类名来命名了。如果你这样做了,在编译时就会提示如图1-17所示的错误。

img

图1-17 因源文件中存在两个public类而报错