资讯动态

Java入门第一课:不写Hello World,先搞懂JDK、JVM与环境变量

发布时间:2026/9/15 23:39:14 来源:尧图企业网站定制
别急着敲那行 System.out.println(Hello World)这事儿真没那么急。我说句可能得罪人的话绝大多数Java新手的第一课都被“Hello World”给带偏了。你花半小时装好 JDK配置完环境变量然后在黑乎乎的终端里打出一行“Hello World”屏幕上确实蹦出来了但你除了“哦它能跑”剩下什么也没学到。Java 不是 C 语言它的核心从来不是“往屏幕上打印点东西”而是“怎么组织和管理复杂的大型系统”。从 Hello World 开始学 Java就像你刚拿到驾照就非要上高速练漂移——不是不行是方向不对而且容易把信心磨没了。这篇文章就是《Java从入门到入土》系列的第一篇。我不打算带你打印那行经典台词而是换个思路先把 Java 这门语言到底是个什么东西、它凭什么能火二十多年、你在入门阶段真正该关注的核心机制是什么讲清楚然后手把手带你跑起一个有真实逻辑、能体现 Java 特性的第一段代码。顺便把 JDK 安装、环境变量配置这些“第一道坎”一次讲透让你之后十次重装系统都不再犯愁。1. 内容整体设计与思路拆解1.1 为什么说“Hello World”是Java新手的第一道坑先说清楚我不是否定 Hello World 本身。它是编程世界的传统也是验证环境好不好的最快捷方式。但问题在于Java 的 Hello World 太“单薄”了承载不了任何 Java 真正重要的概念。对比一下 C 语言#include stdio.h int main() { printf(hello world!); return 0; }C 的 Hello World 至少牵扯到了头文件、主函数、库调用、返回值这四件事大一新生还能从中感知到“哦程序有个入口我得调用别人的函数最后要给系统一个交代”。再看 Java 的 Hello Worldpublic class HelloWorld { public static void main(String[] args) { System.out.println(Hello World); } }这一坨里全是新手根本理解不了的东西public是什么意思class是什么为什么文件名必须和类名一致static是干嘛的String[] args又是什么鬼System.out是什么对象你照着敲完了运行成功了然后呢一个都答不上来。这就是 Java Hello World 最大的问题它表面上是“最简单的程序”实际却堆满了 Java 里最晦涩的前置概念。新手要么囫囵吞枣地抄要么到处百度“为什么 public static void main 这么写”然后被各路零散答案搞得更晕。1.2 Java真正该学的第一课建立“语言世界观”Java 跟 C、Python、JavaScript 不一样。它是一门面向对象、强类型、需要编译、依托虚拟机运行的语言。这四个特性共同决定了你写每一行 Java 代码时的思考方式。如果你第一课就急着敲代码你根本不会有意识地去理解“类”和“对象”这两个 Java 世界的地基。你会把class当成一个固定模板把main方法当成“程序启动的黑魔法”——然后学到后面封装、继承、多态一来直接崩盘。所以我认为Java 真正正确的打开方式是说清楚这几个事情Java 代码跑起来之前机器根本不认识你写的东西得先“翻译”成字节码字节码不是给 CPU 跑的是给 JVMJava虚拟机跑的JVM 是你所有 Java 程序共同的“运行环境”所以 Java 才能跨平台在 Java 里程序的基本单位不是“函数”而是“类”——一切代码都得放进类里。这三个认知才是 Java 新手真正该先建立的东西。有了它们你再写代码每一个关键字、每一个报错信息你都知道它在整个系统里处于什么位置。1.3 这篇文章的设计思路认知先行代码跟上我在这篇里没有按“Hello World → 变量 → 运算符 → 流程控制”的传统路线走。而是先带你搞清楚 Java 运行时的那套底层逻辑然后再动手。代码环节我选的也不是打印一句话而是一个带输入、带计算逻辑、带类结构的小程序——哪怕它只有 20 行也足够让“类、方法、变量、运算符、控制台输入输出”这些真正基础的东西在你脑子里立起来。这套思路你听着可能觉得“不够刺激”但相信我Java 不是一门能靠刺激感学会的语言。它靠的是先建立正确的脑内模型再一点点往模型里填细节。下面这几节我会把环境配置、第一段代码、常见坑位全部走一遍。2. 核心细节解析与实操要点2.1 JDK、JRE、JVM三者的关系你必须弄清楚新手去下载 Java经常会看到三个缩写JDK、JRE、JVM。很多教程直接说“你装 JDK 就行了”但没解释为什么。这里我用一个最接地气的类比讲清楚。把 Java 想成一个工厂流水线JVMJava Virtual Machine是流水线上真正的工人。你的代码最终是它在一行一行地执行。它只认一种语言——字节码.class文件。JREJava Runtime Environment是工人的全套工具箱和工位。包含 JVM 和 Java 自带的核心类库就是那些你不用自己写、直接调用的现成功能。JDKJava Development Kit是整个工厂除了工人和工具箱还包含生产工具——javac编译器把.java文件变成.class字节码、jar打包工具等等。所以你平时写程序、编译程序必须要 JDK因为它里面有编译器。如果你只是运行别人打包好的 Java 程序装 JRE 就够了——不过现实中 Oracle 已经把 JRE 单独下载渠道收掉了所以大家干脆都装 JDK省事。注意JDK 版本选择上我推荐直接装 JDK 17 或 JDK 21LTS 长期支持版本。别碰那些 8、11、17 之外的过渡版本。很多老教程推荐 JDK 8是因为企业里的老项目还在用但作为新手学新不学旧装上 JDK 17 以上才不会碰到“语法太新编译器不认”的鬼问题。2.2 环境变量到底在配置什么为什么总有人配错Java 装完之后教程都会让你配JAVA_HOME和PATH。这一步是新手弃坑率最高的地方因为大部分人根本不理解自己在干什么纯粹照抄。先说结论你配环境变量本质上是在做两件事JAVA_HOME告诉操作系统“JDK 安装在哪里”。很多基于 Java 的开发工具比如 Maven、Tomcat、IDEA不会自己去猜 JDK 的位置它们会问系统要JAVA_HOME。所以你必须设而且要指向 JDK 的安装根目录注意不是 bin 目录是根目录。PATH告诉操作系统“去哪里找可执行命令”。你装完 JDK 后它的 bin 目录下有java.exe和javac.exe。如果不配 PATH你在终端里敲java -version就会提示“不是内部或外部命令”。配置 PATH就是在系统里挂了一个“快捷方式目录”让系统知道要去 JDK 的 bin 目录里找你敲的命令。有个细节非常关键PATH里的值要写成%JAVA_HOME%\bin而不是直接把完整路径写死。这样以后你升级 JDK 版本只需要改JAVA_HOME一个地方所有依赖它的工具都会自动跟着走。2.3 命令行编译 vs IDE第一段代码到底在哪写我见过太多新手一上来就装 IntelliJ IDEA被 IDEA 的工程结构、模块设置、SDK 配置搞得七荤八素一整天也没跑通一个程序于是得出结论“Java 太难了”。实际上第一周学习阶段我强烈建议你只用文本编辑器 命令行来写 Java。原因有二命令行下的流程是透明的。你亲手敲javac编译再敲java运行你能直观看到“源码 → 字节码 → 运行”这三个阶段。而 IDE 把这些全部封装了你点一下绿色小三角就跑起来了完全感知不到底层发生了什么。等你在命令行下跑通了理解了全套流程再上 IDEA你会觉得 IDE 真香而且你再也不会被“Project Structure 里 SDK 没配置”这种问题卡住——因为你已经知道你装好的 JDK 到底在哪。我自己带过很多人入门凡是能坚持先用记事本或者 VSCode 写两周的人后面敲 IDEA 都特别顺。急着上 IDE 的人往往会在某个诡异的弹窗面前卡一下午。2.4 第一段代码选什么一个能“动脑子”的小程序为了让你感受到“类”、“方法”、“变量”这些东西到底是怎么协作的我不让你打印 Hello World而是写一个华氏度转摄氏度的小工具。选它的原因是逻辑简单但完整包含了输入、运算、输出三件事而且你立刻能知道自己写的东西有没有算对——这是 Hello World 给不了你的反馈。程序思路是让用户在控制台输入一个华氏度数值程序把这个值转换成摄氏度然后输出。公式很简单摄氏 (华氏 - 32) × 5 / 9。就这么一个 20 行不到的小东西你写完后理解的东西会比 Hello World 多十倍。它里面有类的定义、有 main 方法、有变量的声明与赋值、有控制台输入输出、有强制类型转换——全是 Java 日常开发高频使用的核心动作。3. 实操过程与核心环节实现3.1 JDK 安装全流程一步步配好环境第一步下载。去 Oracle 官网下载 JDK或者用 AdoptiumEclipse Adoptium 项目的 OpenJDK 发行版。我个人的建议是新手直接用 Adoptium 的安装包它的安装体验更友好不会诱导你装一堆乱七八糟的捆绑软件。到官网选好你的操作系统Windows/macOS/Linux和版本建议 JDK 21下载.msiWindows或.pkgmacOS格式的安装包。第二步安装。双击运行全程默认下一步即可。但有一个地方要特别注意安装路径不要带空格和中文。默认路径是C:\Program Files\Java\jdk-21这里 Program Files 带空格我实测下来大部分时候没事但个别工具会因为这个路径出奇葩问题。我自己是手动改成D:\Java\jdk-21或者C:\Java\jdk-21一劳永逸。第三步配置 JAVA_HOME。Windows 下右键“此电脑”→“属性”→“高级系统设置”→“环境变量”在“系统变量”里点“新建”变量名JAVA_HOME变量值C:\Java\jdk-21或者你实际的安装路径一定到 JDK 根目录第四步配置 PATH。在“系统变量”里找到名为Path的变量双击点“新建”添加一行%JAVA_HOME%\bin注意不要删掉 Path 里面原有的任何内容只追加这一行就行。删错了系统会有别的毛病。第五步验证。打开新的命令行窗口一定要新开旧窗口不会刷新环境变量依次执行java -version javac -version如果两个命令都能输出版本号恭喜你环境这块就算过了。这块经常有人卡住的问题我放在第四节统一讲。3.2 用记事本/VSCode写第一段Java代码确保环境没问题之后新建一个文件夹比如D:\JavaProjects\FirstApp在里面新建一个文本文件命名为TemperatureConverter.java。注意文件名必须和代码里的类名完全一致包括大小写。Java 对大小写敏感temperatureconverter.java和TemperatureConverter.java是两码事编译器只认后者。然后往文件里写这些内容import java.util.Scanner; public class TemperatureConverter { public static void main(String[] args) { Scanner scanner new Scanner(System.in); System.out.print(请输入华氏度数值: ); double fahrenheit scanner.nextDouble(); double celsius (fahrenheit - 32) * 5 / 9; System.out.printf(对应的摄氏度是: %.2f°C%n, celsius); scanner.close(); } }我先一句一句解释这段代码在干嘛import java.util.Scanner;—— Java 里想使用标准类库里的东西就需要提前“导入”。Scanner是 Java 自带的一个工具类专门用来读取用户在控制台输入的内容。public class TemperatureConverter—— 定义一个公开的类。文件名必须跟它一致。记住在 Java 里所有代码都要放进类里类是你组织逻辑的最小容器。public static void main(String[] args)—— 这个就是程序的入口方法。JVM 启动后会找这个方法的签名找到了就从这里开始一行行执行。现在你不用完全理解static和void的含义你只需要知道这个格式是固定的先记住后续文章拆开讲。Scanner scanner new Scanner(System.in);—— 创建了一个 Scanner 对象并让它关联到“标准输入”也就是你的键盘。这句代码里藏着 Java 面向对象最核心的动作声明一个变量、创建一个新对象、把对象赋值给变量。double fahrenheit scanner.nextDouble();—— 程序会停在这里等你输入。你敲一个数字回车它就把这个数字存到fahrenheit变量里。double celsius (fahrenheit - 32) * 5 / 9;—— 这是运算语句。注意括号里先算fahrenheit - 32再乘 5最后除以 9。System.out.printf(...)—— 格式化输出。%.2f表示保留两位小数%n表示换行。这里能看到 Java 用System.out这个对象来代表“标准输出设备”。3.3 编译和运行亲手完成源码到程序的蜕变打开命令行macOS 和 Linux 用终端切换到你保存代码的目录cd /d D:\JavaProjects\FirstApp先执行编译命令javac TemperatureConverter.java这个命令是 JDK 自带的编译器。执行完正常情况下不会输出任何东西但它会在当前目录生成一个新文件TemperatureConverter.class。这就是字节码文件——JVM 真正能看懂的文件。注意很多人到这里以为没反应就是出错了其实恰恰相反没报错就是最大的成功。编译器只有在发现错误时才会在终端输出信息。如果你看到TemperatureConverter.class出现在文件夹里编译这步就过了。然后执行运行命令java TemperatureConverter注意不用带.class后缀直接写类名。这是新手最容易犯的错误写java TemperatureConverter.class会报找不到或无法加载主类。运行起来后程序会提示你输入华氏度。比如你输入100回车它会输出请输入华氏度数值: 100 对应的摄氏度是: 37.78°C华氏 100 度大约就是人的体温你算出来差不多这个值就说明逻辑完全正确。这个反馈跟“Hello World”那种“哦它动了”的感觉完全不一样——你真的在跟程序对话程序真的在帮你解决问题。3.4 这段代码背后的Java核心机制先记下这三个词代码跑通了但我想让你带着这几个问题去接着学第一为什么 JVM 能跨平台因为你写的东西既不是给 Windows 看的也不是给 Linux 看的而是给 JVM 看的。只要某个系统上有对应版本的 JVM你这份.class文件就能在上面跑。你编译一次处处运行前提是装了对应的 JVM。第二类到底是什么在这段代码里TemperatureConverter这个类就像一张“图纸”里面定义了一个名为main的方法也就是流程。Java 世界里所有的“可执行行为”都得先挂在一个类下面不能像 C 语言那样在类外面写一个孤零零的函数。第三为什么变量要先声明类型你看double fahrenheit这句Java 要求在变量前面必须写明它是什么类型。double就是“双精度浮点数”能带小数点。这种“强类型”会逼迫你在一开始就想清楚每个数据是什么——写多了你会发现这其实是优点很多 bug 在编译阶段就会被揪出来。4. 常见问题与排查技巧实录4.1 “javac不是内部或外部命令”的完整排查清单这是 Java 新手遇到最多、最让人崩溃的问题没有之一。你的代码写得再对也没用命令行先给你来一个下马威。碰到这个提示按顺序排查检查项操作说明JDK 是否真正安装成功直接去你装的目录下找bin\javac.exe找不到就说明安装过程有问题重新装一遍JAVA_HOME 是否配对检查变量值是不是指向 JDK 根目录别指到bin目录也别指到上一级目录PATH 是否追加成功检查Path里有没有%JAVA_HOME%\bin有拼写错误就改掉命令行窗口是否重开配置完环境变量后必须新开终端老窗口不会自动更新环境变量这坑了无数人路径是否有特殊字符确认 JDK 安装路径没有中文和空格有的话建议卸了重装到无空格的目录我见过有人卡在这个问题上一下午最后发现只是没重开命令行窗口。记住环境变量只在新的命令行窗口里才能生效。先把这一步试了再折腾别的。4.2 “找不到或无法加载主类”是怎么回事这个报错通常出在运行阶段。原因非常集中敲了类名时带了.class后缀。运行命令是java TemperatureConverter不是java TemperatureConverter.class。当前目录不对。你必须在.class文件所在的目录下运行命令或者用-cp指定 classpath。文件名和类名不一致。比如文件叫abc.java里面的public class却是TemperatureConverter编译虽然有时候能过但运行会直接找不到类。我自己调试时有个习惯每步命令敲完都先dirWindows或者lsmacOS/Linux看一下目录里生成了哪些文件。看到.class文件生成了再执行java命令思路会非常清晰。4.3 中文乱码问题从源头规避如果你在 Windows 命令行下输出中文很可能出现乱码。原因是一般 Windows 中文版默认编码是 GBK而 Java 源码默认按 UTF-8 读取两边对齐不了。最稳妥的解决办法是写代码时全部用英文输出别用中文。这是我劝所有新手的——不是不让你用中文而是入门阶段没必要因为编码问题和编译器较劲。等你熟练了再研究编码配置。如果实在想用中文有两个补救方向一是编译时指定编码javac -encoding UTF-8 TemperatureConverter.java二是把运行窗口编码切到 UTF-8执行chcp 65001。但说实话对一个第一周学 Java 的人来说为这两行命令再花半小时完全没必要。4.4 main方法写错的最常见姿势public static void main(String[] args)这个签名新手经常写错。最常见的三种把String[]写成string[]或者String args[]后者其实语法上合法但不符合惯例漏写static导致程序无法启动把main写成mian编译能过但运行提示找不到主方法。建议你前几次写的时候直接复制这一行模板不要凭记忆敲。等写过二三十次自然就肌肉记忆了。别不好意思——我就是这么过来的你会看到这个签名在职业生涯前几年几乎每天都在出现。5. 学习路线与后续进阶方向5.1 第一周的目标设定不求快求“活”很多新手学 Java 最容易犯的毛病是一天学十章视频课然后发现自己什么也写不出来。我给你的建议是第一周只做一件事把环境这件事彻底玩明白把“编译—运行”的流程跑到形成反射。具体的目标可以是能不用想就写出TemperatureConverter那段代码默认你之前没背过现在动手敲过三遍以上能在命令行下熟练切换目录、编译、运行这一整套流程能徒手配置一台全新电脑的 Java 环境不出错。这三条看着不难但如果你能做到你已经比 70% 的“Hello World 弃坑者”走得更远了。因为大部分人连环境变量那块都没搞明白就放弃了。5.2 哪些知识现在不要碰作为一个过来人我帮你划一条“现在别碰”的线不要去背八股文。网上流行什么“Java 面试八股文”“面试大全”什么动态代理、线程池、JVM 调优这些词你看着眼熟但它们离你现在的位置太远了。现在去背除了让你觉得自己啥也不会、焦虑感爆棚没有任何正面作用。不要去研究“Spring Boot”。我知道你刷帖子会看到大量“学完 Java 就可以上手 Spring Boot 做项目”的说法。但 Spring Boot 是建立在 Java SE 基础之上的框架你连面向对象都没搞明白就去碰框架那是在沙地上盖楼。后面这个系列会专门讲到框架阶段到时候你自然知道何时该入场。不要一上来就研究“冒泡排序”这类算法题。不是说算法不重要而是在你还没写过 1000 行代码之前纠结排序算法的时间复杂度纯属浪费时间。编程手感有了算法是水到渠成的事。5.3 本系列接下来的路怎么走这个系列我计划从这篇“环境与首个程序”开始后面逐步深入变量与数据类型、运算符与表达式、流程控制、数组、面向对象三大特性、异常处理、集合框架、泛型、IO 流、多线程、网络编程最后再进入数据库和 Web 开发阶段。每个阶段我都会用“能跑起来、能看懂、能解决实际问题”的小项目来驱动而不是干巴巴地罗列语法。比如讲数组时我会带你写一个简易的学生成绩统计工具讲面向对象时会带你自己设计一个图书管理类。语法只有在解决问题时才有意义这是我写这个系列最核心的立场。最后说点实际的。我在帮很多人配 Java 环境、带他们写第一段代码的过程里最大的体会是Java 入门的第一道坎不在语法难度而在“信息过载”。你身边有太多声音告诉你“Java 太难了”、“Java 已死”、“现在学 Java 找不到工作”这些噪音在你一开始接触这门语言时就嗡嗡作响。但真相是Java 依然坐拥庞大的生态和岗位需求它依然是这个行业里最值得投入的语言之一。所以这篇的第一个程序我刻意选了一个不酷、但特别接地气的例子。我想让你体会的是Java 不是一个让你背概念的学科而是一项让你“把自己的想法一步步翻译成机器能执行的指令”的手艺。先把你的第一个真正有用的程序跑起来把环境折腾明白这就是最好的开局。我自己当年第一次把温度转换程序跑通时脑子里只有一个念头——“这东西真能按我说的去算数”。那种感觉比打印一百遍 Hello World 都实在得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价