![Java无难事:详解Java编程核心思想与技术(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/851/47548851/b_47548851.jpg)
1.7 第一个程序
1.7.1 了解JDK
要开发Java程序,我们离不开JDK,JDK包含了开发一个Java程序所需要的所有基本工具。下面我们来了解一下JDK安装目录下的文件和文件夹,如图1-8所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_27_1.jpg?sign=1739391310-5dSwAS1LmJrioFZD8us1mKceOYLZE3ke-0-025fdd69c5558c653492edaa32002ea6)
图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了。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_27_2.jpg?sign=1739391310-zeRDC8mxwWJWe8lNTp9tzfxKxwpk778k-0-1e4c398102cfabb29f0ef6bbbd198163)
图1-9 bin文件夹中的可执行程序
其他文件夹我们暂时不需要去了解,未来估计你也用不上。
1.7.2 编写第一个Java程序
下面编写第一个Java程序。
首先寻找一个能存放Java程序的文件夹,在该文件夹下新建一个文本文档,并将其改名为:Hello.java(我们称之为Java源文件)。然后使用文本编辑工具(如记事本、UltraEdit等)进行编辑。Java源程序与C/C++源程序类似,它们都是纯文本文件。
题外话 至于编写Java程序的文本编辑器,读者可以根据自己的喜好选择一个即可。不过像Word、写字板这种带文档样式功能的字处理软件就不合适了。
用文本编辑器打开Hello.java,输入代码1.1。
代码1.1 Hello.java
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_28_1.jpg?sign=1739391310-XIGBdYEOFvwyJZJi2mmbOLzRoF5tL4Gf-0-2db65d9a9c4f1e049c6650c3ec473ec7)
类是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文件夹下,于是我们输入:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_28_2.jpg?sign=1739391310-rWy8gpL2pbDKgjL2PP414bQRxRERzYYR-0-dbbecbe75108dfd1e462442964c691cb)
这次编译成功了。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_28_3.jpg?sign=1739391310-UWIfOP2fdMgqTvCwNrPHLQzjjZU8gvuA-0-56eb83b4af56189a312ae3577008d574)
图1-10 编译Hello.java出错了
在Hello.java文件编译之后,编译器会生成一个Hello.class的文件,这个文件就是Hello类的字节码文件,如图1-11所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_28_4.jpg?sign=1739391310-Fx3ap8cXxvxrnLLJ3NGHv3eBNZiUprgS-0-75b24b56747da211ff45429788b58dab)
图1-11 编译后生成Hello.class文件
下面我们用java.exe来运行一下这个Hello程序,在命令提示符窗口中输入:
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_28_5.jpg?sign=1739391310-MVl9aaQVhQOYcaSxEVbbxRChnYTDRZcX-0-e4bdc7b8bfea9e521b8cc50ca91066bf)
注意:java.exe执行的是Java类,也就是我们编译后的Hello类,但不要添加.class后缀名。
结果如图1-12所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_29_1.jpg?sign=1739391310-vfztmHi2AqCpH6K8lTPssoQGOf4Akcqc-0-f2115ff8fb5c914a0f19c9612217748a)
图1-12 运行Hello程序报错
错误提示指出“在类Hello中找不到main方法”。接触过C语言的读者可能会想到C语言中经典的入门示例“Hello World”,在这个示例中,有一个main函数,作为程序的入口函数。没错,在Java程序中也需要有一个main方法,作为程序的入口方法。接下来修改一下Hello.java文件,如代码1.2所示。
代码1.2 Hello.java
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_29_2.jpg?sign=1739391310-ZCtlJB3y4bNHjDAXFDOoGAtj7ZaWky7u-0-a5db084a29ca37ac2132050295e375bc)
System.out.println()方法会在控制台窗口中输出方法参数的字符串值,并输出一个换行符。
然后,我们按照前述方法编译Hello.java,执行java Hello,结果如图1-13所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_29_3.jpg?sign=1739391310-TNDP5n9Pjc5jXiPKVOuBettMUJrnmxBI-0-983888daa1907f94fb3ecc5586775c49)
图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。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_29_4.jpg?sign=1739391310-56jENtSilxB0g4eAPMYr4fhzmHIVrBlI-0-0fadae527695c8478ea75c9c4dcd43c6)
图1-14 执行小写的hello类报错
当我们忽略Hello类的大小写时,Java解释器会报告“找不到hello类”,我们在Hello.java中定义的类名是Hello,而java.exe程序接收的参数是类的名称而不是一个文件名。由于Java对大小写非常敏感,Hello类与hello类是两个不同的类,所以在执行hello类时会出现无法找到类的错误。因此,读者一定要注意类名称的大小写,以免出现上述的错误。
接下来,我们在Hello.java中再加入一些代码,如代码1.3所示。
代码1.3 Hello.java
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_29_5.jpg?sign=1739391310-MyqnzPmVDfKVWYSKgC8Cj6mYC69RkGk0-0-329399be824c3dcb416ed76138fc2af3)
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_30_1.jpg?sign=1739391310-QyDNGM7xGvI9MhteskKVBXZqETeN1N2y-0-2f1aa9b11f57b4856b5b9ceaeefbb431)
粗体显示的代码是新增的。
至此,我们在Hello.java中已经定义了两个类:Hello和Welcome。再次使用javac编译Hello.java,你会发现此时在程序所在的文件夹下生成了两个.class文件。由此,我们可以推断出,Java编译器会把每个类的编译结果单独放到一个.class文件中,如图1-15所示。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_30_2.jpg?sign=1739391310-TnMYz0YhUZA8PUDFFpb5EI20pOkbL2xc-0-5895c3df9137196e7d3a967b7a67a8b3)
图1-15 编译生成两个.class文件
我们在编写Java程序时,可以在一个.java文件中编写多个类,Java编译器会把不同的类编译到不同的.class文件中。不过在使用java.exe运行Java程序时,需要执行的是有main方法所在的类。针对本例,执行的是Hello类而不是Welcome类。
修改代码1.3,在Welcome类的class关键字前面添加一个public修饰符,如代码1.4所示。
代码1.4 Hello.java
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_30_3.jpg?sign=1739391310-VKfZjjvFMilTPNGANomSJqnBKrxySexl-0-06c25d594173470c4d570b53a9696f68)
再次编译Hello.java,你会看到如图1-16所示的错误。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_30_4.jpg?sign=1739391310-UcpX8MX3cktiszy37QvOpWXmcKBbarGx-0-8b636d243fbdcda8ca402f949d0a3e35)
图1-16 public类名与文件名不符错误
这是因为,Java要求:当一个类声明为public时,那么该类所在的文件名必须与类名相同。由于Welcome类现在声明为public,而文件名是Hello.java,类名与文件名不符,所以在编译时就提示了错误。
将文件Hello.java的名字修改为Welcome.java,编译Welcome.java,此时一切正常。那么一个Java源文件中能否存在两个public类呢?显而易见,这肯定是不行的,如果允许存在两个public类,那么文件名就不知道该用哪个类名来命名了。如果你这样做了,在编译时就会提示如图1-17所示的错误。
![](https://epubservercos.yuewen.com/2C78EE/26947315207549306/epubprivate/OEBPS/Images/44554_31_1.jpg?sign=1739391310-FOnPNvr2GjvygPhTGYhT5BHZRiBbmhXf-0-9321e68eae1a0b39173099da644dd58a)
图1-17 因源文件中存在两个public类而报错