Java 入门
Java 应用程序的元素
我知道你迫不及待地想在你的编辑器中输入一些代码并运行它,看看你的第一个 Java 应用程序的运行效果!别担心,在本教程结束之前,你的期望将会得到满足。但在我们继续之前,我想先介绍几个你需要了解的元素,以便你能够完全理解你在做什么。
即使你熟悉其他一些编程语言,了解编译,知道可执行文件是什么,你可能也会对以下内容感兴趣,因为 Java 的工作方式与 C 或 C++ 不同。
编译和执行 Java 代码
要创建 Java 应用程序,你需要遵循几个步骤。本教程将向你展示如何创建一个非常简单的 Java 应用程序。如果你需要创建一个企业应用程序,创建过程会更加复杂,但在其核心,你会发现这些简单的步骤。
第一步是在文本编辑器中编写一些 Java 代码。
然后,此代码必须转换为另一种格式,以便你的计算机可以执行它。这种转换是由一个称为 *编译器* 的特殊软件进行的。有些语言没有编译器;Java 有。每个编译器都是特定于一种语言的。
编译器生成的的文件通常称为二进制文件或可执行文件。虽然你可以阅读源代码并理解它,但二进制文件或可执行文件并不适合人类阅读。只有你的计算机才能理解它。
此代码包含称为 *字节码* 的特殊二进制代码。这是一个你可能会遇到的技术术语。对什么是 *字节码* 的精确描述超出了本教程的范围。
编译一些代码可能会失败;你的代码必须正确,编译器才能生成它的可执行版本。别担心,本页提供了你将要编译的代码。你只需要复制它并粘贴到你的文本编辑器中。
一旦编译器生成了你需要的二进制文件,你就可以执行这个二进制文件,它将运行你的程序。
这两个步骤:编译和执行需要两个特定的软件,它们是 Java 开发工具包的一部分,也称为 JDK。在本教程的后面,你将看到如何免费下载 JDK 以及如何安装它。
请注意,从 Java SE 11 开始,你还可以将这两个步骤合并为一个步骤,通过直接执行 .java
文件。只有在你执行一个用单个文件编写的程序时,才能使用此功能。如果你的 Java 代码跨越多个文件,这种执行 Java 应用程序的方式将不起作用。
创建第一个 Java 类
你需要了解的第一步是,你编写的 Java 代码保存在纯文本文件中。在本教程中,你的应用程序将被写入一个单独的文本文件中。较大的应用程序可能需要数千个这样的文件。
Java 是一种面向对象的语言。如果这个技术术语对你来说毫无意义,别担心,你现在只需要记住,你编写的所有代码都必须放在 Java 类中。
Java 类是通过在文本文件中进行特殊声明来创建的。只需复制以下代码并将其粘贴到你的文本编辑器中。恭喜!你创建了你的第一个 Java 类!
public class MyFirstClass {
}
这个 Java 类的名称是 MyFirstClass
。你需要将此文本保存在名为 MyFirstClass.java
的文件中。Java 类必须保存在与你的类同名且扩展名为 .java
的文件中。这是强制性的,实际上非常方便,因为你不需要打开文件就知道其中写了哪个类。
你可以给这个类任何名称,只要它不以数字开头。不过,有一个约定:Java 类的名称以大写字母开头。这不是强制性的,但所有 Java 开发人员都遵循此约定。当你成为一名经验丰富的 Java 开发人员时,看到一个不遵循此约定的类会让你觉得很奇怪。
如果你严格按照这个示例进行操作,你应该将 MyFirstClass
类保存在名为 MyFirstClass.java
的文本文件中。
提醒一下:你应该使用纯文本编辑器来创建和保存此文件。使用文字处理器将不起作用。
准备编译你的第一个类
编译是你在创建第一个类之后需要遵循的第二步。它包括将你在 MyFirstClass.java
文件中编写的 Java 代码转换为另一种可以执行的格式。这种转换的结果将存储在编译器创建的另一个文件中。此文件的名称将是 MyFirstClass.class
。
到目前为止,你唯一使用的工具是纯文本编辑器。编译此类需要一个编译器;你的计算机上可能没有。幸运的是,你可以免费下载此编译器并使用它。让我指导你完成这个过程。
截至目前,下载“Java”意味着下载 Java 开发工具包,也称为 JDK。JDK 包含许多工具,其中包括你将用来编译和运行 Java 应用程序的工具。它由 OpenJDK 项目和 Oracle 正式发布。
你可能听说过其他一些元素,也称为“Java”。
JRE 代表 Java 运行时环境。它是 JDK 的一个子集,不再由 OpenJDK 或 Oracle 发布。它只包含运行 Java 应用程序所需的工具。你无法使用 JRE 中提供的工具来编译代码。
你可能还听说过 J2EE、Java EE 或 Jakarta EE。所有这些缩写都指的是 Java 企业版。它是一组用于创建企业级应用程序的工具和库。Java EE 与 JDK 不同,并且超出了本教程的范围。你不需要 Java EE 来编译和运行我们在这个教程中创建的简单应用程序。
设置 Java 开发工具包
你可以从不同的位置下载 JDK。有一个一站式页面始终指向 JDK 的最新版本:https://jdk.java.net/。选择最新的“可使用”JDK 版本将带你到一个页面,你可以在其中下载你需要的 JDK 版本。
从这个页面,你可以下载五个版本
- Linux/AArch64
- Linux/x64
- macOS/x64
- macOS/AArch64
- Windows/x64
此页面提供 Java 开发工具包的生产就绪开源构建,它是 Java SE 平台在 GNU 通用公共许可证版本 2 下的实现,并包含类路径例外。
为 Windows/x64 设置 JDK
让我们下载 Windows 版本。你得到的是一个大约 200MB 的 ZIP 文件,你可以使用任何 ZIP 实用程序软件打开它。这个 ZIP 文件包含 JDK。你可以在计算机上的任何位置解压缩此文件的内容。
完成此操作后,你需要创建一个名为 JAVA_HOME
的环境变量,它指向你解压缩 JDK 的目录。首先,你需要打开一个 DOS 提示符。如果你在 D:\jdk\
目录中解压缩了一个 JDK 22 ZIP 文件,那么你需要在 DOS 提示符中输入的命令如下
> set JAVA_HOME=D:\jdk\jdk-22
请注意,在这个示例和所有其他示例中,开头的 >
用于表示你需要在提示符中输入此命令或将其粘贴到提示符中。你不应该输入或粘贴此字符,因为它不是 set
命令的一部分。
你可以通过输入以下代码来检查 JAVA_HOME
变量是否已正确设置
> echo %JAVA_HOME%
此命令应该打印以下内容
D:\jdk\jdk-22
然后,你需要更新你的 PATH
环境变量,将 JDK 目录的 bin
目录添加到其中。这可以通过以下命令完成
> set PATH=%JAVA_HOME%\bin;%PATH%
在设置这两个变量时,你需要非常小心,因为一个简单的错误,比如添加一个空格或缺少一个分号,会导致失败。
不要关闭此命令提示符。如果你关闭它并再次打开它,那么你需要再次创建这两个变量。
为 Linux/x64 设置 JDK
让我们下载 Linux 版本。你得到的是一个扩展名为 .tar.gz
的存档文件,你需要将其展开。
要展开它,你需要将其复制或移动到正确的目录。然后,你可以输入以下命令
$ tar xzf *.tar.gz
请注意,在这个示例和所有其他示例中,开头的 $
用于表示你需要在提示符中输入此命令或将其粘贴到提示符中。你不应该输入或粘贴此字符,因为它不是 tar
命令的一部分。
此命令将展开当前目录中所有扩展名为 .tar.gz
的文件。如果你只需要展开它,可以使用此文件的精确名称。
执行此命令可能需要几秒钟或更长时间,具体取决于你的系统。它将在当前目录中创建一个新目录,其中包含 JDK 的内容。
完成此操作后,你需要创建一个名为 JAVA_HOME
的环境变量,它指向你展开 JDK 的目录。如果你在 /home/javauser/jdk
目录中展开了一个 JDK 22 存档文件,那么你需要在 shell 提示符中输入的命令如下
$ export JAVA_HOME=/home/javauser/jdk/jdk-22
确切的目录取决于你展开的发布文件。
你可以通过输入以下代码来检查 JAVA_HOME
变量是否已正确设置
$ echo $JAVA_HOME
此命令应该打印以下内容
/home/javauser/jdk/jdk-22
然后,你需要更新你的 PATH
变量,将 JDK 目录的 bin
目录添加到其中。这可以通过以下命令完成
$ export PATH=$JAVA_HOME/bin:$PATH
在设置这两个变量时,你需要非常小心,因为一个简单的错误,比如添加一个空格或缺少一个分号,会导致失败。
不要关闭此 shell 提示符。如果你关闭它并再次打开它,那么你需要再次创建这两个变量。
你可以通过输入以下命令来检查一切是否正常
$ which java
你的 shell 应该打印到刚刚展开的发布的 bin
目录中 java
可执行文件的完整路径。在这个示例中,它将打印
/home/javauser/jdk/jdk-22/bin/java
为 macOS 设置 JDK
让我们下载 macOS 版本。你得到的是一个扩展名为 .tar.gz
的存档文件,你需要将其展开。
要展开它,你需要将其复制或移动到正确的目录。然后,你可以输入以下命令
$ tar xzf *.tar.gz
请注意,在这个示例和所有其他示例中,开头的 $
用于表示你需要在提示符中输入此命令或将其粘贴到提示符中。你不应该输入或粘贴此字符,因为它不是 tar
命令的一部分。
此命令将展开当前目录中所有扩展名为 .tar.gz
的文件。如果你只需要展开它,可以使用此文件的精确名称。
执行此命令可能需要几秒钟或更长时间,具体取决于你的系统。它将在当前目录中创建一个新目录,其中包含 JDK 的内容。此目录的扩展名为 .jdk
。
完成此操作后,您需要创建一个名为JAVA_HOME
的环境变量,该变量指向您解压缩 JDK 的目录。如果您在/Users/javauser/jdk
目录中解压缩了 JDK 22 存档文件,那么您需要在此 shell 提示符中键入的命令如下
$ export JAVA_HOME=/Users/javauser/jdk/jdk-22.jdk/Contents/Home
确切的目录取决于你展开的发布文件。
你可以通过输入以下代码来检查 JAVA_HOME
变量是否已正确设置
$ echo $JAVA_HOME
此命令应该打印以下内容
/Users/javauser/jdk/jdk-22.jdk/Contents/Home
然后,您需要更新您的PATH
变量,将 JDK 目录的bin
目录添加到其中。可以使用以下命令完成此操作
$ export PATH=$JAVA_HOME/bin:$PATH
在设置这两个变量时,你需要非常小心,因为一个简单的错误,比如添加一个空格或缺少一个分号,会导致失败。
不要关闭此 shell 提示符。如果你关闭它并再次打开它,那么你需要再次创建这两个变量。
你可以通过输入以下命令来检查一切是否正常
$ which java
你的 shell 应该打印到刚刚展开的发布的 bin
目录中 java
可执行文件的完整路径。在这个示例中,它将打印
/Users/javauser/jdk/jdk-22.jdk/Contents/Home/bin/java
编译您的第一个类
正确设置 JDK 后;JAVA_HOME
变量和PATH
变量,您就可以编译您的第一个类了。
您现在键入的所有命令都应在与您用于设置这两个变量的提示符相同的提示符中键入。
编译和运行您的第一个 Java 程序
无论您是遵循 Windows、Linux 还是 macOS 路径,其余部分都是相同的。
- 更改到您保存第一个类
MyFirstClass.java
的目录。您可以通过键入dir
来检查您是否在正确的目录中。它将显示您在此目录中拥有的文件。您应该看到您的MyFirstClass.java
文件。 - 通过键入以下内容来检查您的编译器是否可以从此目录访问。无论您是在 Windows 还是 Linux 上,此命令都是相同的。
> java -version
它应该告诉您当前使用的javac
版本。如果它给您一个错误消息,那么您需要检查您的JAVA_HOME
和PATH
变量,因为它们很可能存在问题。
- 现在您已准备好编译您的第一个代码。您可以键入以下内容。
> javac MyFirstClass.java
此时可能会发生两件事。您可能收到错误消息,告诉您编译器无法编译您的代码,因为您的 Java 代码中存在错误。您需要在继续之前修复它们。
如果编译器保持沉默,并且没有抱怨任何事情:恭喜!这意味着您的 Java 代码已成功编译。再次检查目录内容应该会显示一个新文件:MyFirstClass.class
将代码添加到您的类以运行它
到目前为止,您的类是空的;它里面没有可执行代码。如果您能够成功编译它,那么您可以进入下一步并执行一些代码。
只需打开您的MyFirstClass.java
文件,并将以下代码复制到其中。
public class MyFirstClass {
public static void main(String... args) {
System.out.println("Hello, World!");
}
}
您可能知道,在计算机科学中有一个由来已久的传统,那就是编写一个程序,在应用程序的控制台上打印“Hello, World!”。所以让我们这样做吧!
此类中有一些技术代码,您可能不太清楚。不用担心;您需要做的就是按照上一节中描述的步骤进行编译。
确保编译器为您创建了MyFirstClass.class
。要运行它,您只需键入以下命令
> java MyFirstClass
这应该在控制台上打印Hello, World!。如果是这样:恭喜!您已经能够运行您的第一个 Java 程序了!
将 Hello World 程序作为单个文件应用程序运行
从 Java SE 11 开始,您可以运行 Java 应用程序,而无需经过编译步骤,只要程序是用单个文件编写的。这就是这个简单的Hello, World!应用程序的情况。
您只需键入以下内容
> java MyFirstClass.java
它将在控制台上打印Hello, World!消息。
常见问题及其解决方案
编译器问题
Microsoft Windows 系统上的常见错误消息
javac is not recognized as an internal or external command, operable program or batch file
如果您收到此错误,Windows 找不到编译器javac
。
以下是一种告诉 Windows 在哪里找到javac
的方法。假设您在C:\jdk22
中安装了 JDK。在提示符下,您将键入以下命令并按 Enter
C:\jdk22\bin\javac HelloWorldApp.java
如果您选择此选项,您每次编译或运行程序时,都必须在javac
和java
命令之前加上C:\jdk22\bin\
。为了避免这种额外的输入,请参阅 JDK 22 安装说明中的更新PATH
变量部分。
Class names, HelloWorldApp, are only accepted if annotation processing is explicitly requested
如果您收到此错误,您忘记在编译程序时包含.java
后缀。请记住,命令是javac HelloWorldApp.java
,而不是javac HelloWorldApp
。
UNIX 系统上的常见错误消息
javac: Command not found
如果您收到此错误,UNIX 找不到编译器javac
。
以下是一种告诉 UNIX 在哪里找到 javac 的方法。假设您在/usr/local/jdk22
中安装了 JDK。在提示符下,您将键入以下命令并按 Return
/usr/local/jdk22/javac HelloWorldApp.java
注意:如果您选择此选项,每次编译或运行程序时,您都必须在javac
和java
命令之前加上/usr/local/jdk22/
。为了避免这种额外的输入,您可以将此信息添加到您的PATH
变量中。执行此操作的步骤将根据您当前运行的 shell 而有所不同。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested
如果您收到此错误,您忘记在编译程序时包含.java
后缀。请记住,命令是javac HelloWorldApp.java
,而不是javac HelloWorldApp
。
语法错误(所有平台)
如果您在程序的某个部分中输入错误,编译器可能会发出语法错误。该消息通常会显示错误类型、检测到错误的行号、该行上的代码以及代码中错误的位置。以下是一个由于省略语句末尾的分号 (;
) 而导致的错误
Testing.java:8: error: ';' expected
count++
^
1 error
如果您看到任何编译器错误,那么您的程序没有成功编译,并且编译器没有创建.class
文件。仔细验证程序,修复您检测到的任何错误,然后重试。
语义错误
除了验证您的程序在语法上是否正确之外,编译器还会检查其他基本正确性。例如,编译器会在您每次使用未初始化的变量时向您发出警告
Testing.java:8: error: variable count might not have been initialized
count++;
^
Testing.java:9: error: variable count might not have been initialized
System.out.println("Input has " + count + " chars.");
^
2 errors
同样,您的程序没有成功编译,并且编译器没有创建.class
文件。修复错误并重试。
运行时问题
Microsoft Windows 系统上的错误消息
如果您收到此错误,java
找不到您的字节码文件HelloWorldApp.class
。
java
尝试查找您的.class
文件的位置之一是您的当前目录。因此,如果您的.class
文件在C:\java
中,您应该将您的当前目录更改为该目录。要更改您的目录,请在提示符下键入以下命令并按 Enter
cd c:\java
提示符应该更改为C:\java>
。如果您在提示符下输入dir
,您应该看到您的.java
和.class
文件。现在再次输入java HelloWorldApp
。
如果您仍然遇到问题,您可能需要更改您的CLASSPATH
变量。要查看是否需要这样做,请尝试使用以下命令覆盖类路径。
set CLASSPATH=
现在再次输入java HelloWorldApp
。如果程序现在可以工作,您将需要更改您的CLASSPATH
变量。要设置此变量,请参阅 JDK 安装说明中的更新 PATH 变量部分。CLASSPATH
变量以相同的方式设置。
Could not find or load main class HelloWorldApp.class
初学者程序员常犯的一个错误是尝试在编译器创建的.class
文件上运行java
启动器。例如,如果您尝试使用java HelloWorldApp.class
而不是java HelloWorldApp
运行程序,您将收到此错误。请记住,参数是您要使用的类的名称,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求您使用它执行的类具有一个main
方法,作为应用程序执行的起点。更详细地了解将代码添加到您的类以运行它部分讨论了 main 方法。
UNIX 系统上的错误消息
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp
如果您收到此错误,java
找不到您的字节码文件HelloWorldApp.class
。
java
尝试查找您的字节码文件的位置之一是您的当前目录。因此,例如,如果您的字节码文件在/home/jdoe/java
中,您应该将您的当前目录更改为该目录。要更改您的目录,请在提示符下键入以下命令并按 Return
cd /home/jdoe/java
如果您在提示符下输入pwd
,您应该看到/home/jdoe/java
。如果您在提示符下输入ls
,您应该看到您的.java
和.class
文件。现在再次输入java HelloWorldApp
。
如果您仍然遇到问题,您可能需要更改您的CLASSPATH
环境变量。要查看是否需要这样做,请尝试使用以下命令覆盖类路径。
unset CLASSPATH
现在再次输入java HelloWorldApp
。如果程序现在可以工作,您将需要以与上述PATH
变量相同的方式更改您的CLASSPATH
变量。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
初学者程序员常犯的一个错误是尝试在编译器创建的.class
文件上运行java
启动器。例如,如果您尝试使用java HelloWorldApp.class
而不是java HelloWorldApp
运行程序,您将收到此错误。请记住,参数是您要使用的类的名称,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求您使用它执行的类具有一个main
方法,作为应用程序执行的起点。更详细地了解将代码添加到您的类以运行它部分讨论了 main 方法。
更进一步
这个第一个 Java 程序向您展示了每个 Java 开发人员运行应用程序所遵循的基本步骤。
- 在一组
.java
文本文件中创建一个源代码 - 编译这些文件以生成一组相应的
.class
二进制文件 - 将它们一起运行作为应用程序。
在大型应用程序上工作的开发人员不使用纯文本编辑器来管理他们的源代码;他们使用集成开发环境。IDE 是复杂的软件应用程序,专门用于软件开发。这些应用程序会自动处理源代码的编译,它们可以帮助您跟踪 Java 代码语法中的错误,并找出执行中的错误,等等。
其中一些工具是开源的,可以免费使用。
Eclipse 基金会维护 Eclipse
,Apache 基金会维护 NetBeans
,- JetBrains 发布了
IntelliJ IDEA 社区版
,它可以免费用于个人和商业开发。
更多学习
最后更新: 2024 年 3 月 26 日
返回教程列表