“Hello, world"程序是指在计算机屏幕上输出“Hello, world”这行字符串的计算机程序,“hello, world”的中文意思是“你好,世界。”。因为《The C Programming Language》中使用它做为第一个演示程序,非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这一习惯。
也称源代码,是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。
在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
首先,来看下使用 Java 语言编写 HelloWorld 源程序的全貌:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
在这段源程序的代码虽然非常少,但是我们能从中得到如下信息:
public static void main(String[] args)
类名.成员名
,访问实例成员的语法是 实例名.成员名
"Hello World!"
作为初学者,对以上叙述的内容有部分可能不太理解,但不用着急,随着学习的深入,这些都会慢慢地被理解,我也会在后面的文章中详细阐述。
您在这段源程序中看到了哪些信息呢?在评论区留言给我吧!
在源程序所在目录下执行如下命令可对当前编写的源程序进行编译
javac HelloWorld.java
在编译结束后,会产生一个 .class 文件,这就是《搭建本地软件开发环境 》中提到的字节码文件,使用如下命令可将该字节码文件通过 JVM 解释给计算机并执行。
java HelloWorld
在 DOS 中,我们可以使用 &&
将多个命令写到一条指令中,使其按顺序执行,关于这个我在《常用DOS命令 》一文中有提及。
cls && javac HelloWorld.java && java HelloWorld
当我们修改源程序中的字面量后,重新执行上述指令,会发现命令行打印了新的字面量信息。但如果字面量中包含中文的话,例如 "您好,世界!"
,就会乱七八糟的文字,这是因为 javac 指令在编译源程序的时候,默认的字符集不支持中文,我们需要为其指定支持中文的字符集,一般情况下,我们选择UTF-8字符集,修改编译指令如下:
javac -encoding UTF8 HelloWorld.java
我们使用 java 指令执行 java 程序的时候,我们采用的指令是:java HelloWorld
,我们在第二章节中搭建开发环境的时候说到过我们需要通过配置环境变量使得 java 指令能够在命令行中全局可用。这里的 java 指令实际上就是存在于 Window 操作系统磁盘上一个可执行的程序,也就是 JDK 中 bin 目录下的 java.exe,如图所示:
到这里我们知道了,之前修改系统环境变量 Path 的值,将该目录加入其中的目的是为了系统能找到这个指令。这个道理就跟我们在某个目录下找到一个可执行程序,双击启动该程序的道理一样。
在指令 java HelloWorld
中,java 程序是系统来执行的,而 HelloWorld 则是系统在执行java 程序的时候我们传递给这个程序的参数。这就好比在第一章提到的 CD 指令一样,当我们给 CD 指令传递参数是 ..
的时候,系统在执行CD这个程序后,会将当前目录切换到上级目录;当我们给 CD 指令传递参数是 /
的时候,系统在执行CD这个程序后,会将当前目录切换到根目录 。话说回来,我们给 java 指令传递的参数是 HelloWorld,那 java 这个程序在执行过程中,会在当前目录和环境变量指定的 CLASSPATH 目录下查找 HelloWorld.class 文件,如果找到了该字节码文件,则通过 JVM 来解释并执行,如果依然找不到这个源程序,则会提示 错误: 找不到或无法加载主类 HelloWorld 。
注:关于 CLASSPATH 的详细说明请参考文末的 PATH 和 CLASSPATH 段落。
关于 JVM,百度百科上的描述是 —— 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。那这个虚构的计算机在解释并执行 java 字节码的时候,能像 DOS 那样传递参数吗?
注:此图截自 2020年二月,仅作参考,因为百科上的内容可被编辑,故而,若您看到的说明不是此图上的内容,请以官方的为准。
DOS 在执行一个程序的时候,将程序名后面的文本看作是参数,那么,我们把 JVM 也看作是一个计算机操作系统的话,那大致可以这样理解:
换句话说,站在 DOS 的角度,传递了 HelloWorld 和 Hello 两个参数;而在 JVM 的角度,传递了Hello这一个参数。那既然我们传递了参数给 HelloWorld 程序,那 HelloWorld 程序如何接收到该参数,并作出相应的处理呢?
在上文中,我们看到 main 函数的形式参数 args 貌似都没有什么用处,实际上他就是为了接收外部传递的参数而存在的,关于形式参数的用法将会在后面分享函数的章节中详细为大家介绍。修改 HelloWorld.java 的代码如下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("您好,世界!");
if(args == null || args.length < 1) {
return;
}
for(int i = 0; i < args.length; i++) {
System.out.println("得到第" + (i + 1) + "个形参的值:" + args[i]);
}
}
}
然后我们在 DOS 终端中输入如下指令:
cls && javac -encoding UTF8 HelloWorld.java && java HelloWorld Hello World
得到的结果如下图所示:
在修改之后的源程序中,用到了后面章节才有的条件语句,循环结构等,如果初学者看不懂这部分,仅作了解即可。
PATH 是一个系统全局变量,其值表示的是该操作系统中可执行文件的搜索路径。使得在 DOS 中执行某个命令的时候不需要自己手动查找该命令所在的磁盘的具体位置。其值具体格式是:
在上一个章节中,在 PATH 变量的值的后面增加了 %JAVA_HOME%\bin
,其目的是为了在 DOS 中执行 java 指令的时候,让系统能够到我们安装的 JDK 目录下进行查找。
所以,PATH 是 Windows 操作系统中可执行文件的搜索路径集合。
同理,CLASSPATH 是 JVM 可被解释并执行的字节码文件的搜索路径集合。
所以,当我们在 CLASSPATH 中配置了 HelloWorld 程序所在目录后,达到的效果是:即便 DOS 终端驻留的目录不是 HelloWorld 程序所在目录,也能通过 java HelloWorld
成功执行该程序。
JDK的内置库中包含了一些工具包,在 dt.jar 和 tools.jar 中,推荐的 CLASSPATH 配置是:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar