![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
1.7 第一个程序
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_10.jpg?sign=1738910914-NNgzHERmXcho4RJfb24CsMQd1ueNOrwt-0-f6cab31f14c6e76dd51f05c15340729f)
扫码看视频
1.7.1 了解JDK
要开发Java程序,我们离不开JDK,JDK包含了开发一个Java程序所需要的所有基本工具。下面我们来了解一下JDK安装目录下的文件和文件夹,如图1-8所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_11.jpg?sign=1738910914-Fxlj2231SQbPy4paSvPJtkXXVfjj1IBB-0-d67046b815bc700a06689bb17800556d)
图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](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_12.jpg?sign=1738910914-tJGKDxTzs1b0UCermedTLqh1TJ4v21tk-0-067e410d77a091af3165cc0f28e592b1)
图1-9 bin文件夹中的可执行程序
其他文件夹我们暂时不需要去了解,未来估计你也用不上。
1.7.2 编写第一个Java程序
下面编写第一个Java程序。
首先寻找一个能存放Java程序的文件夹,在该文件夹下新建一个文本文档,并将其改名为:Hello.java(我们称之为Java源文件)。然后使用文本编辑工具(如记事本、UltraEdit等)进行编辑。Java源程序与C/C++源程序类似,它们都是纯文本文件。
题外话 至于编写Java程序的文本编辑器,读者可以根据自己的喜好选择一个即可。不过像Word、写字板这种带文档样式功能的字处理软件就不合适了。
用文本编辑器打开Hello.java,输入代码1.1。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_13.jpg?sign=1738910914-YbI8jy0h64Ufb6JJ3j9qCdmdkCUA6O2e-0-1667feb7474547e2d048ceca40c5a271)
类是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](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_14.jpg?sign=1738910914-tSvnNy7yxQYdtedMKZgSFSZcm3xzXk0z-0-7f6e817704930bd7bc9e0354659d5967)
这次编译成功了。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_15.jpg?sign=1738910914-petjhBbqihhsl0gA0kDar5A0UWFhZjQw-0-bdce1bba270ac9650c4c16b579c8cfdb)
图1-10 编译Hello.java出错了
在Hello.java文件编译之后,编译器会生成一个Hello.class的文件,这个文件就是Hello类的字节码文件,如图1-11所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_16.jpg?sign=1738910914-cPBOhYjdv5D4DNNjaNLMk2gNHPH7x3zN-0-b8c762e1b715ed1a1fcee1fa4f93fa18)
图1-11 编译后生成Hello.class文件
下面我们用java.exe来运行一下这个Hello程序,在命令提示符窗口中输入:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_17.jpg?sign=1738910914-AO12nwbpz9TXsxMbG0z4xPpY4yPzdiii-0-95afa8854bcc08e672b06d5d4d21fa93)
注意:java.exe执行的是Java类,也就是我们编译后的Hello类,但不要添加.class后缀名。
结果如图1-12所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_18.jpg?sign=1738910914-bqcfySefaJyrfrAuKIah06EBIfmcKTZZ-0-e19177ba9240f78b60ad4a0a8a7f5bd4)
图1-12 运行Hello程序报错
错误提示指出“在类Hello中找不到main方法”。接触过C语言的读者可能会想到C语言中经典的入门示例“Hello World”,在这个示例中,有一个main函数,作为程序的入口函数。没错,在Java程序中也需要有一个main方法,作为程序的入口方法。接下来修改一下Hello.java文件,如代码1.2所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_19.jpg?sign=1738910914-hW1erTcwYDPnYWcoP5RapsVISlOu6FYC-0-27a361e90143cbe8407d6b8d73e50a96)
System.out.println()方法会在控制台窗口中输出方法参数的字符串值,并输出一个换行符。
然后,我们按照前述方法编译Hello.java,执行java Hello,结果如图1-13所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_20.jpg?sign=1738910914-WdZQZIhCe2BuBifuniWTUm1LGECgN2Wr-0-8668daaa002890859a57bb91bd4e9639)
图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](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_21.jpg?sign=1738910914-gGOEOT2fTBcms0d3We1bz67oluQ1wW67-0-b178bc84fb92b45c8b5308daa1f91b79)
图1-14 执行小写的hello类报错
当我们忽略Hello类的大小写时,Java解释器会报告“找不到hello类”,我们在Hello.java中定义的类名是Hello,而java.exe程序接收的参数是类的名称而不是一个文件名。由于Java对大小写非常敏感,Hello类与hello类是两个不同的类,所以在执行hello类时会出现无法找到类的错误。因此,读者一定要注意类名称的大小写,以免出现上述的错误。
接下来,我们在Hello.java中再加入一些代码,如代码1.3所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_22.jpg?sign=1738910914-Vp3udStUM5SQhHi7sQN2vLdkv3I6H4fG-0-e841b6896613a0768fa181303d864c2a)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_23.jpg?sign=1738910914-OOCFsO88Dzge2DIVOj76KzOL3R4g7NS0-0-a1b1b6592fb5750d0675e92360ce3b96)
粗体显示的代码是新增的。
至此,我们在Hello.java中已经定义了两个类:Hello和Welcome。再次使用javac编译Hello.java,你会发现此时在程序所在的文件夹下生成了两个.class文件。由此,我们可以推断出,Java编译器会把每个类的编译结果单独放到一个.class文件中,如图1-15所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_24.jpg?sign=1738910914-YCbp8qXHpwOtFfPw5zHwl5Q4Y1iUXbPt-0-2ae2c8edeb8e59f77fc9b5b1b8273922)
图1-15 编译生成两个.class文件
我们在编写Java程序时,可以在一个.java文件中编写多个类,Java编译器会把不同的类编译到不同的.class文件中。不过在使用java.exe运行Java程序时,需要执行的是有main方法所在的类。针对本例,执行的是Hello类而不是Welcome类。
修改代码1.3,在Welcome类的class关键字前面添加一个public修饰符,如代码1.4所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_25.jpg?sign=1738910914-6oAkkA3nXg7JFhb60XoUDlk575DVBrzc-0-48d29afbf8881915c8c1ebdcac75c7e7)
再次编译Hello.java,你会看到如图1-16所示的错误。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_26.jpg?sign=1738910914-OEf1NFPnbFxQjtFFdI3hLTtGci9GbDog-0-c79e24e1b5b95269b31388a3bfd498fa)
图1-16 public类名与文件名不符错误
这是因为,Java要求:当一个类声明为public时,那么该类所在的文件名必须与类名相同。由于Welcome类现在声明为public,而文件名是Hello.java,类名与文件名不符,所以在编译时就提示了错误。
将文件Hello.java的名字修改为Welcome.java,编译Welcome.java,此时一切正常。那么一个Java源文件中能否存在两个public类呢?显而易见,这肯定是不行的,如果允许存在两个public类,那么文件名就不知道该用哪个类名来命名了。如果你这样做了,在编译时就会提示如图1-17所示的错误。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt001_27.jpg?sign=1738910914-0mdVyFfa5vsB49or4HQwjjBR0YSsOsoX-0-e57a4fb41721cda4dd78959517c968cb)
图1-17 因源文件中存在两个public类而报错