在上一篇教程,我们完全是模仿式地在编写第一个Java程序,从宏观层面知道编写Java程序首先需要电脑上有个工程文件夹,然后才能在这个基础上编写代码以及运行代码。没错,学习编程本质上就是一个边模仿边自我主动探索的过程,这和我们学习任何一门语言一样。
整个过程中有很多细节概念当时没有给大家说明,目的是让我们从整体上有个清晰的了解,而不至于一下接触太多新的概念。然而,现在正是时候来深入地理解我们编写的第一个Java程序。
首先来看看IntelliJ IDEA为我们创建的HelloWorld工程在电脑上是什么样子。找到工程的保存目录,比如“D:\yizhouxuejava”。会发现里面有个“HelloWorld”文件夹,这正是我们的工程文件夹。
接着进入HelloWorld目录,
这些各种类型的文件和有特定命名的文件夹,共同说明了这个HelloWorld文件夹是一个在IntelliJ IDEA中创建的Java工程。我们前面添加的Java源文件,对应地位于src目录里面,
这与我们前面在IntelliJ IDEA中操作左侧工程浏览窗口的结果相对应,当时是选中“src”目录,然后向里面添加了一个名叫“HelloWorld.java”的文件。
out目录里面保存的是当我们点击IntelliJ IDEA里面的运行按钮后产生的结果,最核心的是“HelloWorld.class”文件。
在深入地理解我们前面编写的代码前,先从另外一个宏观角度了解任何一个Java程序是如何运行起来的。
我们用Java语言在文档里面编写代码,只不过这个文档有个特殊后缀“.java”。这个过程叫做编写代码,如果用程序员的行话讲,叫做码代码。类似于我们用中文母语或者英文在文本编辑器里面写文章。
这种代码文件电脑没办法理解,电脑只理解0-1二进制符号。但是却方便我们人类来编写、开发电脑程序,试想一下如果只用0、1两个符号来对电脑下达命令,对于各种各样的命令这个过程得有多么痛苦,而且非常容易出错。
因此在运行Java程序时,代码需要从最高级转变成电脑能直接理解的二进制,这个过程类似于翻译器在两种语言之间进行翻译转义。对于编程,这个“翻译”过程叫做编译,有专门的工具程序来负责,这类程序对应地也就被叫做编译器,比如JDK里面的“javac.exe”工具。
前面out目录里面的“HelloWorld.class”文件,就是编译过程中产生的层级更低的代码文件,相对于“HelloWorld.java”而言。这类以”.class”为后缀的文件,在Java中被叫做字节码文件。字节码是比二进制更高级的符号,因为在计算机中每八个二进制为一组,为一个字节,英文单词是Byte。
聪明的你可能有疑问,不是说电脑只理解0-1二进制命令吗,那么字节码程序咋个运行。因为字节码是一类中间过渡代码,电脑在执行前还需要进一步被编译成更低级的代码,这个由JDK里面的“java.exe”工具程序负责。字节码文件主要是方便跨操作系统使用,专门的术语叫做跨平台,当我们在Windows系统中编译出来的.class文件,不需要任何修改就可以在苹果MacOS以及Linux系统使用。只需要其他系统安装了对应的JDK。
接下来就开始梳理这个程序的代码部分,
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
首先是类头部分,
public class HelloWorld
这里我们声明了一个名叫HelloWorld的Java类,关于类这个概念大家目前不用了解,后面会专门学习什么是类,现在只需要知道它是从英文单词“Class”翻译过来的。第一个单词public是Java的保留关键词,用来指明这个类的访问权限。说它是保留关键词,是因为这类单词在Java代码中有特殊作用,比如Java编译器需要靠这些关键词的标记作用来编译代码。“public”翻译成中文有“公共的、公开的”意思,说明这个类有公开权限。大家目前只需要了解到这个程度,后面会系统具体地学习访问权限。第二个单词class也是Java的保留关键词,用来指明这里我们声明的是一个类,后面的字符“HelloWorld”则是我们在代码中给这个类赋予的名称。
关于类头这个用语,可能在其他Java教程中没有这样指代,这里这样称呼是方便与花括号包围起来的代码相区分。有的英文版Java编程书籍里面有使用到类头这个概念,英文单词是“Class Header”。
在类头后面是第一对花括号,作为这个类的身体部分,它详细地描述了这个类的组成结构。与类头相对应,这里我们用类体来区分,英文单词是“Class Body”。
这个类的类体部分只有这样一段代码,
public static void main(String[] args) {
System.out.println("Hello World!");
}
首先我们声明了一个名叫main的Java方法,关于方法这个概念目前大家也不需要了解,只需要知道main方法是一个特殊情况,它是每个Java程序的入口,电脑在运行Java程序时,会首先扫描里面是否有名叫main的方法,如果有则会从这里开始一条命令一条命令地执行。
与前面一样,这里将这段代码
public static void main(String[] args)
称之为方法头,单词public指明了这个方法有公开访问权限,单词static也是Java保留关键词,中文意思有“静态的、静止的”,这里大家暂时不用了解其含义。void也是Java保留关键词,用来指明这个main方法的返回数据类型,在中文里面有“空的”的意思。关于方法以及其返回类型,这里大家不用了解。圆括号里面的代码“String[] args”是main方法的参数,关于什么是参数后面会专门学习,大家暂时不用了解。
在方法头圆括号后面是整段代码里面的第二对花括号,对应地叫做这个main方法的方法体,“Method Body”,里面只有一行代码,
System.out.println("Hello World!");
这行代码是整个程序的核心功能,用来告诉电脑程序需要在操作系统的输出设备里面打印一行字符“Hello World!”。关于这段代码“System.out.println()”的意思现在不用理解,只需要知道它的作用是在系统输出设备中打印出圆括号里面的信息,比如用双引号包围起来的一串字符“Hello World!”。
因此,从外往内来看这段代码的结构,首先是第一部分,
public class HelloWorld {
......
}
然后是省略号指代的main方法,作为第二部分,
public static void main(String[] args) {
......
}
第三部分是最关键的功能代码,
System.out.println("Hello World!");
自此我们对前面编写的第一个Java程序有了一定的了解,仍然尊重“不一次性灌输过多概念”的原则,这篇教程只在核心知识点上帮助大家拉近了与Java编程的距离,后面会由浅入深、循序渐低地继续学习其他概念。
接下来交给大家一个任务,作为编程小练习,试一试可以有多少种方法来在屏幕上打印“Hello Java!”这句话。