Jakob Jenkov 2020-02-21
Java 程序是一系列按照特定顺序执行的 Java 指令。由于这些指令是按顺序执行的,因此 Java 程序有明确的开始和结束。
要运行你的 Java 程序,你需要告诉 Java 虚拟机(JVM)从哪里开始执行。在 Java 中,所有的代码都必须位于 Java 类 内部。类是一种将相关数据和指令组合在一起的方式。因此,一个类可以包含 变量 和 方法。变量用于存储数据,而方法则将一组对数据进行操作的指令组合在一起。如果你现在还不完全理解这些概念,不用担心,后续内容会详细解释。
一个简单的 Java 类声明
下面是一个不包含任何变量、方法或其他指令的简单 Java 类声明:
public class MyClass {}
这段 Java 代码必须保存在一个与类名相同、并以 .java 为后缀的文件中。具体来说,文件名必须是 MyClass.java。一旦文件名与类名匹配且以 .java 结尾,你就可以使用 Java SDK 中的编译器进行编译,或者更方便地,在 Java IDE 中完成编译。
建议将你的类放在一个 Java 包(package) 中。Java 包本质上就是文件系统中的一个目录,可以包含一个或多个 Java 文件。包可以像目录一样嵌套。例如,你可以创建一个名为 myjavacode 的包,它对应于硬盘上的一个名为 myjavacode 的目录。
如果你将 Java 类放在一个包中,就必须在 Java 文件顶部指定包名。以下是前面那个类加上包声明后的样子:
package myjavacode;
public class MyClass {}
注意:此时
MyClass.java文件必须位于myjavacode目录下,并且文件内部必须包含package myjavacode;声明。仅仅把文件放在正确的目录中,或者只在文件中写包声明,都是不够的——两者缺一不可。
main() 方法
Java 程序需要一个起点来开始执行。Java 程序通过执行某个类中的 main 方法来启动。你可以选择要执行的类,但不能更改方法的名称——该方法必须始终命名为 main。
以下是将 main 方法添加到之前类中的示例:
package myjavacode;
public class MyClass {
public static void main(String[] args) {
}
}
这里的三个关键字 public、static 和 void 具有特殊含义。目前你不需要深究它们的作用,只需记住:main() 方法的声明必须包含这三个关键字。
在三个关键字之后是方法名。回顾一下,方法是一组可以被当作单一操作来执行的指令。通过“调用”(即执行)一个方法,就能运行该方法内部的所有指令。
方法名后面首先是左括号 (,然后是一组参数列表。参数是可以传递给方法的变量(数据/值),方法内部的指令可以利用这些参数来定制其行为。main 方法必须始终接收一个 String 对象数组作为参数。
声明一个 String 数组的方式如下:
String[] stringArray
暂时不必担心 String 或 数组(array) 是什么,这些会在后续章节中详细讲解。另外,参数的名字可以自由选择。在前面的 main() 示例中,我使用了 args,而在另一个例子中用了 stringArray,这完全取决于你。
在方法参数列表之后,首先是左花括号 {,接着是一些空白区域,最后是右花括号 }。花括号之间的部分称为方法体,用于放置当 main 方法被调用时要执行的 Java 指令。上面的例子中方法体为空,没有任何指令。
现在我们在 main 方法体中加入一条指令:
package myjavacode;
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello World, Java app");
}
}
这条指令:
System.out.println("Hello World, Java Program");
会将文本 Hello World, Java Program 打印到控制台。如果你从命令行运行 Java 程序,就会在命令行窗口中看到输出;如果你在 IDE 中运行程序,IDE 通常会捕获所有控制台输出并在其界面中显示出来。
运行 main() 方法
通常,你会通过命令行(控制台)来启动 Java 程序。你调用 JRE 自带的 java 命令,并告诉它要执行哪个 Java 类,以及要传递给 main() 方法的参数。Java 应用程序随后在 JVM 中执行(也有人认为是由 JVM 执行)。
命令行执行 java 命令,进而运行 Java 主程序。以下是一个具体的命令行示例:
java -cp classes myjavacode.MyClass
- 第一部分是
java命令,用于启动 JVM。在某些情况下,你可能需要指定java命令在计算机上的完整路径(通常位于 Java 安装目录的bin子目录中)。 - 第二和第三部分(
-cp classes)告诉 JVM 编译后的 Java 类位于哪个目录(cp表示 class path,即类路径)。这里假设编译后的类位于名为classes的目录中。 - 第四部分是要执行的 Java 类的名称。注意,这里使用的是全限定类名,即包含了包名
myjavacode.MyClass。
向 main() 方法传递参数
你可以从命令行向 main() 方法传递参数。例如:
java -cp classes myjavacode.MyClass Hello World
当 JVM 执行 myjavacode.MyClass 的 main() 方法时,传入的 String 数组参数将包含两个字符串:"Hello" 和 "World"。
main() 方法可以通过如下方式访问这些参数:
package myjavacode;
public class MyClass {
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println(args[1]);
}
}
注意对数组元素 args[0] 和 args[1] 的引用:
args[0]将包含字符串"Hello"args[1]将包含字符串"World"
关于 Java 源代码的编译和运行,详见文章:Java 项目概述、编译与执行。
变量和数组将在后续章节中详细讲解。如果你现在还不完全理解,不必担心。
Java 主类(Main Class)
如果你的 Java 程序中只有一个类包含 main() 方法,那么这个类通常被称为主类。
你可以在项目中拥有任意多个包含 main() 方法的类。但是,Java 虚拟机每次只能被指示运行其中一个。你仍然可以从 JVM 所执行的那个 main() 方法中调用其他类的 main() 方法(尽管你还没学到如何做),也可以启动多个 JVM 实例,每个实例分别执行一个 main() 方法。