Java实用教程:从环境配置到编写第一个程序

AI提示词32分钟前发布 jdkjadmin
0 00
Java实用教程:从环境配置到编写第一个程序

Java实用教程:从环境配置到编写第一个程序

Java 常用于企业后端、服务端应用、金融与业务系统、Android 开发以及大数据生态中的部分工具。它有成熟的开发工具和庞大的类库,适合构建需要长期维护、部署环境较多的应用。不过,Java 并非所有任务的最佳选择:写一个很短的一次性脚本,Python 或 Shell 可能更省事;做浏览器页面,则需要 HTML、CSS 和 JavaScript。本文从安装开发环境开始,带你编译并运行一个 Java 程序,同时解释版本、命令行参数和安全方面的边界。

一、先弄清楚 JDK、JRE 和 JVM

初学时常会遇到三个缩写:

  • JVM 是 Java 虚拟机,负责执行编译后的 Java 字节码。
  • JRE 是运行 Java 程序所需的运行时环境,通常包含 JVM 和运行库。
  • JDK 是 Java 开发工具包,包含运行环境以及编译器等开发工具。

开发 Java 程序应安装 JDK。现代 JDK 已包含运行程序所需的组件;对于常见开发场景,安装 JDK 即可,不必另外寻找一个独立的 JRE。JDK 版本则需要结合项目要求选择:新项目通常可以考虑受支持的 LTS(长期支持)版本,例如 Java 21 或 Java 25;接手已有项目时,应先查看项目文档、构建文件和部署环境,再决定使用哪个版本。并非“版本越新,所有项目越适合”。

二、安装 JDK 并检查环境

从可信的 JDK 发行渠道下载适用于自己操作系统的安装包。可选择 Oracle JDK 或其他 OpenJDK 发行版。不同发行版的授权条款、更新政策和支持服务可能不同;如果用于公司项目或商业部署,应核对所选发行版当前的许可与支持条件。安装时注意操作系统架构,例如 x64 与 ARM64,下载错误的架构可能无法安装或运行。

安装完成后,打开新的终端,检查 Java 运行时和编译器是否可用:

java -version
javac -version

java 用来启动 Java 程序,javac 用来编译 Java 源文件。两条命令都能显示版本号,通常说明相应工具已在系统的命令搜索路径中。如果提示“找不到命令”或“不是内部或外部命令”,可能是 JDK 没有安装成功,或者环境变量尚未配置。

需要手动配置时,先确认 JDK 的实际安装目录。将 JDK 的 bin 目录加入 PATH,可以让终端找到 java 和 javac。可选地设置 JAVA_HOME 指向 JDK 根目录,而不是 bin 目录;不少构建工具会读取这个变量。Windows、macOS 和 Linux 的环境变量配置方式不同,建议使用当前系统的图形设置或 shell 配置文件,并在修改后重新打开终端验证。不要照抄他人机器上的安装路径。

如果电脑上安装了多个 JDK,java 与 javac 可能来自不同目录。可分别查看它们的实际位置:Windows 使用 where java 和 where javac;macOS 或 Linux 通常可用 which java 和 which javac。发生版本不一致时,先检查 PATH 顺序和 JAVA_HOME,再排查项目构建工具的版本配置。

三、创建第一个 Java 程序

新建一个目录,例如 java-first,在其中创建文件 HelloWorld.java。Java 源文件通常以 .java 结尾。输入以下完整代码:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

这里的 HelloWorld 是类名。由于它是 public 类,源文件名必须与类名一致,大小写也必须一致,即文件名应为 HelloWorld.java。Java 区分大小写,helloworld 和 HelloWorld 是不同名称。

main 方法是传统 Java 命令行应用的入口。可以把它拆开理解:public 表示该方法可被外部访问;static 表示不创建该类对象也能调用;void 表示该方法不返回结果;String[] args 用于接收命令行参数。System.out.println 会向标准输出写一行文本。

在终端中切换到文件所在目录,先编译,再运行:

javac HelloWorld.java
java HelloWorld

正常情况下,第一条命令生成 HelloWorld.class,第二条命令输出:

Hello, Java!

执行 java HelloWorld 时,通常写类名而不是 HelloWorld.class。如果当前目录不是默认的类路径,可以显式指定类路径:

java -cp . HelloWorld

-cp 是 --class-path 的缩写,. 表示当前目录。在 Windows 上,类路径包含多个目录或 JAR 文件时通常用分号分隔;macOS 和 Linux 通常用冒号分隔。路径分隔符不同是跨平台脚本中的常见差异。

四、用命令行参数让程序接收输入

命令行参数会按顺序放入 args 数组。下面的程序接受一个姓名参数;如果没有提供参数,则提示用法:

public class Greet {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("用法:java Greet <姓名>");
            return;
        }

        System.out.println("你好," + args[0] + "!");
    }
}

保存为 Greet.java,编译并运行:

javac Greet.java
java Greet 小林

输出为:

你好,小林!

尖括号在帮助文字中表示占位内容,运行时不要把它们作为姓名的一部分输入。参数默认按空格分隔;如果某个参数本身含空格,应按操作系统的命令行规则加引号,例如:

java Greet "小林同学"

命令行参数并没有一个通用的、固定的业务条数上限。实际上,操作系统或命令解释器会限制一次启动命令的总长度,限制因平台和启动方式而异;Java 的 String[] 也受到可用内存和数组实现限制。因此,不应把超大数据集放进命令行参数。更合适的做法是从文件、标准输入、数据库或网络服务读取数据。

示例为了便于理解只读取 args[0]。真实程序应检查参数数量、校验格式,并对缺失或无效输入给出明确错误提示。命令行参数不是天然可信的来源:它可能来自脚本、用户输入或自动化任务,不应直接拼接进 SQL、Shell 命令或文件路径而不进行合适的校验和处理。

五、用交互式方式快速试代码

JDK 中通常包含 JShell,可以交互式执行表达式和语句,适合验证语法或小段逻辑。打开终端运行:

jshell

进入提示符后输入:

System.out.println("Hello from JShell");

退出时可输入 /exit。JShell 适合快速探索,不等同于完整项目开发:它不会替你管理应用结构、测试、依赖和发布流程。若命令提示找不到 jshell,可能是安装的 JDK 版本或发行包未提供该工具,也可能是环境变量未配置。

六、从单个文件走向 IDE 和项目

刚入门时,使用文本编辑器和终端有助于理解源文件、编译和运行之间的关系。开始维护多个类、写测试或引入第三方依赖后,可以使用 IntelliJ IDEA、Eclipse 或 Visual Studio Code 等开发工具。安装 IDE 并不会代替 JDK:通常仍需在 IDE 中选择合适的 JDK,并确认项目的语言级别与目标版本。

项目逐渐变大时,构建工具可以统一管理依赖、编译、测试和打包。Maven 与 Gradle 是常见选择。构建工具文件中的 Java 版本设置很重要:它可能控制代码可使用的语言特性,也可能影响生成产物的目标版本。仅在本机安装了某个 JDK,不代表部署环境也支持该版本。开始项目时应确定开发、构建和运行环境要求,并在持续集成与部署环境中保持一致。

Java 适合开发具有多模块结构、需要成熟类库和长期维护能力的服务端应用。它也常见于企业系统、批处理工具和跨平台后台程序。Java 程序通常需要 JVM 运行,因此打包和部署时要考虑目标机器是否有合适的运行时,或采用项目选定的打包、容器与运行时分发方式。Java 的跨平台能力不意味着所有程序不经测试就能在每个系统上完全一致:文件路径、字符集、时区、原生库和权限仍可能造成差异。

七、常见错误与排查办法

1. 找不到 javac

这通常表示只配置了运行命令,或者 PATH 没有指向 JDK 的 bin 目录。检查 javac -version,确认安装的是 JDK,并在修改环境变量后重开终端。

2. 找不到主类

Could not find or load main class 常与运行目录、类名或类路径有关。确认当前目录包含编译生成的 .class 文件,命令使用的是类名而非源文件名,并检查包声明。示例程序没有声明 package,因此可直接在当前目录运行;声明了包的类需要按包名运行,且类路径应指向包目录的上层。

3. 文件名与类名不一致

对 public 顶层类,文件名必须与类名一致。例如 public class HelloWorld 必须放在 HelloWorld.java 中。注意大小写,部分文件系统对大小写的处理不同,但 Java 的名称仍区分大小写。

4. 把源文件名当作运行类名

传统编译流程是先用 javac HelloWorld.java 编译,再用 java HelloWorld 启动。新版本 Java 也支持直接启动单文件源代码,例如 java HelloWorld.java,但这属于另一种启动方式,并不表示文件名就是类路径中的运行类名。初学时先掌握显式编译流程,更容易定位问题。

5. 版本不匹配

如果出现类文件版本不兼容等错误,通常是编译所用 JDK 与运行所用 Java 版本不一致,或项目目标版本高于部署环境。分别运行 java -version、javac -version,并检查 IDE、构建工具和部署容器的设置。不要只通过更换本机默认版本解决问题而忽略项目约束。

6. 中文显示异常

乱码可能来自源文件编码、终端编码或文件读写时使用的字符集不一致。现代项目通常采用 UTF-8,并在编辑器、构建工具和运行环境中统一配置。若程序读写文件,应显式指定字符集,而不要依赖运行机器的默认值。

八、写程序时应注意的安全边界

Java 提供类型系统、异常处理、内存管理和丰富的安全相关 API,但“使用 Java”并不等于程序自动安全。内存管理能减少一类手工内存管理错误,不能替代输入校验、权限控制、依赖更新和安全设计。运行在 JVM 中也不会自动阻止应用访问它被授予的文件、网络或系统资源。

  • 验证外部输入:对命令行参数、HTTP 请求、文件内容和数据库数据检查类型、长度、格式及业务范围。校验失败时应安全地报错,不要默默接受异常值。
  • 避免命令注入:不要把用户输入拼接成 Shell 命令。确需调用外部进程时,优先使用接受参数数组的进程 API,并对允许执行的程序和参数作严格限制。
  • 保护机密:不要把密码、令牌或私钥写进源代码、公开仓库、日志或异常信息。通过受控的配置与密钥管理方式提供凭据,并限制其权限。
  • 谨慎处理文件路径:如果文件名来自外部输入,应限制访问目录并规范化路径,防止路径穿越等问题。还需考虑符号链接和操作系统权限。
  • 维护依赖与运行环境:定期检查所用 JDK、框架和第三方库的安全更新,移除不需要的组件。使用容器并不会自动消除应用漏洞,容器配置和权限同样需要审查。

Java 本身没有一个适用于所有程序的“输入安全开关”。具体防护要结合应用类型、威胁模型和所用 API 设计;对涉及身份认证、支付、个人信息或敏感数据的系统,还应采用代码审查、自动化测试、依赖扫描及相应的安全评估。

九、从这里继续

至此,你已经完成了 JDK 检查、源文件编写、命令行编译与运行,也了解了参数、类路径和常见环境问题。接下来可按目标继续学习:面向对象基础、集合与泛型、异常处理、文件与网络 I/O、单元测试,以及 Maven 或 Gradle。每学一个概念,都可以尝试写一个小程序验证行为,并在遇到错误时先检查文件名、运行目录、版本和输入,再查看编译器或运行时给出的具体信息。

掌握这些基础后,不必急着一次写出大型应用。把代码拆成清晰的方法,明确输入和输出,用测试验证边界条件,再逐步增加功能,通常比堆叠复杂语法更可靠。

© 版权声明

相关文章