知道了 java(TM) 的class和method的语法之后,我们就能设计一个Java 程序了。Java 应用程序由一个或多个定义了数据和行为的class组成。Java编译器将源程序转换成为一种净化处理过的格式。该格式只不过是操作-操作数对(Operation-operand(s))的一个线性排列:
...
...
...
...
这种数据流叫做字节码流(bytecode stream),或简称 Java 字节码(Java bytecodes)。字节码流中的操作实现所谓的虚拟机(基于软件的指令处理器)的指令集,此虚拟机通常称作 Java 虚拟机(JVM)。实现 JVM 的程序用作简单地处理Java的class文件,有时为特定的环境设计。例如,支持Java的Web浏览器如 Netscape Navigator 和 Internet EXPlorer,都包含一个 JVM 的实现。实现 JVM 的独立程序被称作Java解释器(interPReters)。
Java 编译器将字节码流存到一个以 .class 为文件名后缀的文件即通常所说的 class 文件中。任何 Java 解释器都能读或者说处理这个流--“解释”每一个操作和相应的数据(即操作数)。解释过程分为:
(1) 进一步将净化的字节码翻译成宿主计算机的机器指令;
(2) 治理程序的执行。
下面的流程图说明了编译和执行的过程:
Java的class文件是可跨平台移植的,而Java编译器和解释器则是不可移植的,他们通常是用C语言编写并被编译成各计算机平台固有的机器语言。因为Java编译器产生的字节码文件都遵循一种预先定义好的格式而且与机器无关,同时任何Java解释器能读懂字节码并进一步将之翻译成机器指令,因此一个Java程序无需重新编译就可以随处运行。
通常将一个class的定义存为一个相应文件名的Java源文件。如上例中的Dog,就被存为文件 Dog.java。Java 编译器对源文件进行处理生成字节码的class文件,上例中为Dog.class,但在 Dog示例中,Dog.class 并不是一个 Java 程序。
一个 Java 程序由一个或者多个class文件构成, 其中必须有一个定义了程序运行的起始点--Dog.class 则没有。从另一个角度说,起始点正是Dog这样的class和实现程序的class的不同之处。Java中,程序的起始点用main()方法定义。同样,一个程序必须有一个设计良好的终止点。Java中,停止程序运行的一个办法是调用或者说执行系统(system)方法exit()。
因此,在我们能做任何令人兴奋的事情前,我们应该有一个具有明确起始点和终止点的程序。用一个随意的用户定义的数据类型即可达到目的。该类型提供了main()和exit()行为,以及用于确认实际执行的简单输出操作:
public class SimpleProgram {
public static void main(String[] args) {
System.out.println("This is a simple program.");
System.exit(0);
}
}
main() 的方法标记是不可以改变的。至此,你可仿照上例简单地定义一个程序的入口--用 public 和 static 限制符以及 void返回类型。System ( java.lang.System) 是每一种 Java 环境中都提供的一个标准的 class ,它定义了许多实用的操作。
上例中用到了两个操作:
(1) 将数据显示到标准输出设备(通常为一个 IDE 窗口或者是操作系统的命令窗口)上;
(2) 让程序退出(exit)。
注重调用 exit() 时用 0 做参数是为了告诉调用程序和 Java 解释器运行没有出错,也就是说,程序是正常退出的。
到此为止,我们已经有两个class了:一个是真实世界的,用户定义的数据类型Dog,另一个 class 则相当神奇:它将特定应用行为与开始和终止程序的机制联系起来了。
现在该熟悉一下Java开发环境了。假如你有一个集成开发环境(IDE),它可能是也可能不是 file-oriented 的。在大多数的开发环境中,Java 源代码存放在文件里。一个比较有名的例外是 IBM 的 VisualAge for Java,它将 class 的定义存在工作区(workspace area)中。
当使用 file-oriented 的 IDE 时,需要注重文件名与 class 名相匹配;尤其要注重 class 的名字和文件的名字都是大小写敏感的。当然,你还需遵循因考虑系统环境变量设置等而为 Java 环境所设定的那些规则。