编译和运行一个简短的示例程序是开始介绍Java的诸多关键元素的最佳方法。我们将使用以下代码:
下面将运行以下三步:1)输入程序;2)编译程序;3)运行程序。
创建一个程序的第一步就是将源代码输入到计算机中。正如前面所介绍的那样,程序的源代码是程序可由人类阅读的形式。必须使用文本编辑器,而不是字处理软件将源代码输入到计算机中。字处理软件一般不仅存储文本信息,还存储格式信息。格式信息会使Java编译器困惑。源代码必须只包含文本。如果使用IDE,则IDE会提供源代码编辑器可供使用。除此之外,任意的简单的文本编辑器都可以使用。例如,如果使用Windows操作系统,可以使用记事本(Notepad)程序。对于许多计算机语言,存储程序源代码的文件的名字是任意的。但是对Java不是这样。首先你需要知道,在Java中,源文件的名称是非常重要的。例如,在这个例子中,源文件的名称必须是Example.java。下面介绍这样做的原因。在Java中,源代码的正式名称是编译单元(compilation unit)。它是一个文本文件,包括一个或多个类的定义(还可能有其他东西)。从现在起,我们将使用只包含一个类的源文件。Java编译器需要源代码使用文件扩展名.java。观察程序,会发现程序中定义的类名也是Example。这并不是巧合。在Java中,所有代码必须存在于类中。按照惯例,主类的名字要和存储程序的文件名相同。请确保文件名的大小写与类名也相同,这是因为Java是区分大小写的。从这点看,文件名与类名相同的约定似乎是武断的,但是遵循这样的规则使得维护和组织程序更加容易。
在运行程序前,需要用javac编译程序。为了编译Example程序,需要像下面这样执行javac并在命令行指定源文件的名称:
编译器javac创建一个名为Example.class的文件,它包含程序的字节码版本。记住,字节码不是可执行的代码。字节码必须由Java虚拟机执行,它不能直接由CPU执行。
为了实际运行程序,必须使用java。本书曾提到,java对程序的字节码进行操作。为了执行Example程序,将类名Example作为命令行的参数,如:
当程序运行时,会显示下面的输出:
在编译Java源代码时,每个单独的类都输出到以类名为文件名、以.class为扩展名的文件中。这也是为什么把Java源文件命名为包含它的类的原因。这样,源代码的名字就可以和.class文件的名字相同。当像之前一样执行java时,实际上指定了希望执行的类名。程序java会用这个类名自动搜索以.class为扩展名的文件。如果找到了文件,它就会执行包含特定类的代码。
尽管Example.java相当短小,但是它包含这所有Java程序都具有的一些关键特性。让我们详细查看程序的每一部分。程序以下面的代码开始:
这是注释(comment)。正如其他编程语言一样,Java可以在源文件中输入注释。编译器会忽略注释的内容。但是,注释向阅读源代码的人描述或解释程序的操作。在这个例子中,注释对程序进行描述,提醒你该源文件需要命名为Example.java。当然,在实际应用程序中,注释通常解释程序的一部分如何工作,或有什么特别的功能。在程序的顶端的注释称为多行注释(multiline comment)。这种注释以/开头,以/结尾。编译器忽略在这两个注释符号间的所有内容。顾名思义,多行注释可以长达好几行。程序代码的下一行是:
这行使用关键字class来声明一个新定义的类。本书曾提及,在Java中,类是封装的基本单位。Example是类名。类的定义以左花括号({)开始,以右花括号(})结束。花括号内的元素是类的成员。现在只需要了解所有的程序活动都在一个成员中发生,不要对类中的其他细节过于在意。在也是为什么所有Java程序都或多或少有些面向对象的原因。程序下一行是单行注释(single-line comment)。如下所示:
这是Java支持的第二种注释种类。单行注释由两个斜线(//)开始,到本行末尾结束。一般而言,程序员用多行注释标注长注释,用单行注释标志短的逐行描述。代码的下一行如下所示:
这行是main()方法的起点。本书曾提及,Java中的子程序称为方法。正如之前的注释所述,这是程序开始执行的地方。所有的Java应用程序从执行main()方法开始执行。这里不再给出该行每个部分的具体含义,因为这涉及许多对Java的其他特性的详细理解。但是,由于本书中的许多例子将会用这行代码,因此对其有个简单介绍还是会使我们了解它的一般概念。该行以关键字public开始。它是访问修饰符(access modifier)。访问修饰符节决定程序的哪些部分能够访问类的成员。当一个类的成员以public开始时,类外的代码就可以访问该成员。(与之相反的是关键字private,它阻止类外定义的代码使用成员。)必须把main()方法声明为public,因为它需要由Example类外的代码执行。在本例中,java应用程序启动器调用main()方法。关键字static使得main()方法可以独立于任意对象运行。因为JVM要在任何对象构造前执行main()方法,所以这是必要的。关键字void告诉编译器main()方法没有返回结果。(稍后你将会看到,方法也能返回结果。)如果以上让你感到困惑,不要担心。所有这些概念将在后续章节中详细讨论。本书曾提及,main()是Java应用程序开始时调用的方法。方法名后面的圆括号内指定变量,传递给方法的所有信息由这些变量接收。这些变量称为形参(parameter)。如果给定的方法不需要形参,仍然需要包括一对空圆括号。main()方法需要一个形参。在程序Example中的形参是String[]args,这意味着形参名为args。这是一个类型为String的对象数组。数组(array)是相似对象的集合。String类型的对象存储字符串。(数组和String类型都会在后续章节详细讨论。)在本例中,形参args接收程序执行时所有出现的命令行参数。程序Example并不使用命令行参数,但是本书后面的其他程序会使用命令行参数。该行的最后一个字符是左花括号({)。这标志着main()方法主体的开始。该方法中所有代码会在方法的左花括号和右花括号间出现。下一行代码如下所示。它出现在main()方法中:
这行在屏幕上输出字符串“Java drives the Web.”,并另起一行。输出实际上是通过内置的println()方法完成的。在本例中,println()方法显示传递给它的字符串。下文将会介绍,println()方法还可以用来显示其他种类的信息。这行以System.out开始。System是一个预定义的类,它提供对系统的接口,out是连接控制台的输出流,对其具体介绍在此时过于复杂。于是,System.out是封装控制台输出的对象。Java用对象来定义控制台的输出也是其面向对象本质的进一步证据。你可能会猜想,控制台的输入/输出在现实生活中的Java应用程序中并不常用。因为大部分的现代计算环境本质上是窗体式的或图形界面的,控制的输入输出也常用于简单的实用程序、演示程序(正如本书中展示的程序)和服务器端程序。在后面也会学习如何创建图形界面(Graphical User Interface,GUI),但目前将继续实用控制台输入输出的方法。注意println()语句以分号结束。Java中的所有语句都以分号结束。程序中的其他行没有以分号结束,是因为从技术上说它们不是语句。第一个右花括号结束main()方法,最后的右花括号结束类Example的定义。最后说明一点:Java区分大小写。忽略这点会造成严重的问题。例如,如果将误将main输入为Main,或误将println输入为PrintLn,上述程序就不正确。另外,Java编译器会编译一个不包含main方法的类,所以就没有办法执行它。所以,如果拼写错了main,编译器仍可以编译程序,但是在寻找main()方法时,java会报告错误。
相关资源:Java7程序设计入门经典(Herbert Schildt)源代码