
Java程序设计课第一节最容易翻车的不是学生是老师。我见过两种典型课堂一种用大半节课讲Java历史从Oak写到咖啡Logo学生听完只记住“一次编译到处运行”这句口号另一种上来就把public static void main(String[] args)甩到屏幕上学生抄完代码满脑子问号连文件名为什么必须叫HelloWorld都不知道。第一节课真正应该做的是让学生亲手把一行代码变成运行结果在屏幕上看到Hello, Java并且让他发自内心觉得这东西我能学会。这篇文章写给两种人正准备带第一节Java课的老师/学长以及零基础想自学Java的同学。我不会复述课程大纲而是按我带班的实际节奏把第一节课的设计思路、环境搭建、代码逐词拆解、常见翻车现场全部摊开讲。你可以直接照着用也能根据自己班级节奏改。1. Java第一课的核心目标先建立“程序能跑起来”的完整体验1.1 第一课不急着讲语法先把流程这根主线立起来很多初学者觉得Java难不是因为语法真有多难而是脑子里始终没有一幅“程序到底怎么运行”的地图。我第一节课的切入点是提问“你现在点一下鼠标电脑凭什么知道你要干什么”听起来很玄其实我要引出的就是一条极简主线写代码 → 编译 → 运行 → 看到结果。这条主线必须在前50分钟里被学生亲眼看到。我一般在IDE演示之前先用记事本写一个HelloWorld.java然后在命令行里敲javac和java。学生看到源代码变成了一个.class文件再从.class文件变成屏幕上的文字那个过程比任何PPT都管用。他们从此脑子里会有个画面哦原来代码不是一写完就能跑中间还有一道“翻译工序”。这也是为什么第一节课我不追求讲完多少语法点。一节课如果能让学生跑通第一个程序离开教室前还能自己改掉一句话、输出一个新的字符串这节课就已经成功了。1.2 50分钟课堂的时间分配参考我带过不少班也帮刚接手Java课的同事改过课件最后稳定下来的一套50分钟分配方案是这样的时间段做什么目的0-5分钟提问“程序是怎么跑起来的”收集学生脑中的答案建立好奇心暴露认知空白5-15分钟用记事本命令行演示HelloWorld的编译运行让学生看到“源码→字节码→输出”全过程15-30分钟逐行拆解public class、main方法、println把第一行代码的每个“怪词”解释清楚30-40分钟演示变量和字符串拼接做“自我介绍卡”小例子让代码开始有“变化”避免死记40-48分钟学生自己动手改代码改名字、改数字、故意制造一个错误亲手体验“改代码-出错-解决”的闭环48-50分钟预告下一节课内容留一个“下节课我要学什么”的钩子这个节奏的核心思路是每讲一个概念后面必须跟着一个学生能亲手操作的体验。如果只是老师在上面一路讲学生下面一路抄第一节课的兴奋感很快就会被击穿。2. 从安装JDK到跑出第一个HelloWorld手把手实操2.1 JDK版本选择别追新选LTS版本就行环境搭建是第一节课最大的坑没有之一。很多学生装完JDK第一步就卡在“我该下载哪个版本”上。我的建议很简单用LTS长期支持版目前我推荐JDK 17或JDK 21。我现在带的班默认装JDK 17理由很朴素稳定、网上资料多、大多数企业线上还在用而且和IDEA、VS Code的兼容性都很好。JDK 21也可以用但有些旧的第三方工具链还没完全跟上第一节课不想给学生添乱。下载时认准官方渠道也可以选用国内一些云厂商提供的镜像下载速度快一些。注意看清楚自己的操作系统类型和位数比如Windows 11一般是64位直接下载x64安装包就行。安装路径我建议用一个不含空格和中文的目录比如D:\Java\jdk-17这一步能省掉后面很多莫名其妙的环境变量问题。2.2 JDE_HOME与PATH配置为什么要这样配很多旧教程还在让学生配CLASSPATH我已经很久不让学生在第一步配这个了。现代JDK根本不需要手动设置CLASSPATH系统默认会从当前目录和标准类库里寻找类。第一节课就把CLASSPATH搬出来纯属徒增焦虑。我们需要配的是两个东西JAVA_HOME和PATH。JAVA_HOME指向JDK的安装根目录比如D:\Java\jdk-17。它的作用是让Tomcat、Maven、IDEA这些后续工具能快速找到JDK。我经常跟学生开玩笑JAVA_HOME就像你家的快递默认地址别的软件要给你寄东西时不用问你细节直接按这个地址来。PATH则需要把%JAVA_HOME%\bin加进去。bin目录里放着java、javac这些可执行命令配好PATH之后你在命令行里敲java -version系统才知道去哪把java命令找出来。不配PATH你只能cd到JDK的bin目录里敲命令很难受。配置完一定要打开一个新的命令行窗口分别输入java -version javac -version如果看到版本号一致输出说明环境变量生效了。如果提示“不是内部或外部命令”九成是PATH没配好或者窗口没重启。2.3 命令行跑通HelloWorld的完整过程我坚持在第一节课用命令行演示一次即使后面会切到IDE。因为命令行是最朴素的方式它能把“编译”和“运行”两个步骤暴露得清清楚楚IDE把这一切都隐藏了。在某个目录下新建一个文本文档重命名为HelloWorld.java注意扩展名必须是.java。用记事本或VS Code打开写进去public class HelloWorld { public static void main(String[] args) { System.out.println(Hello, Java); } }保存之后在命令行里切到该目录然后执行javac HelloWorld.java正常情况下目录里会多出一个HelloWorld.class文件这就是编译生成的字节码。接着执行java HelloWorld注意这里一定不能带.class后缀。如果敲成java HelloWorld.class会报“找不到或无法加载主类”这是第一节课出现率最高的报错之一。原理很简单java命令后面跟的是类名不是文件名。命令行路线跑通之后再切回IDE学生就明白IDE里那个“Run”按钮背后到底干了什么。之后再怎么使用IDE都不慌。3. 第一行Java代码逐词拆解类、main与println3.1 public class为什么必须和文件名一致学生看到public class HelloWorld时最常见的表情就是“这是什么鬼”。我一般这样解释Java要求一个文件的公共类名和文件名保持一致这是编译器为了方便查找和管理类而设的约定。你定义一个叫HelloWorld的类系统就会在HelloWorld.java这个文件里找它对不上号就报错。可以类比成班级名和门牌号的关系你挂的是“三年二班”的门牌结果里面班长自我介绍说“我是一年五班的”那教务处肯定找不着人。类名和文件名一致就是最基础的对号入座。我还会让学生试着改一改类名比如改成HelloJava然后保存成HelloWorld.java再编译看看报错信息。让他们亲眼看到那个红色的错误提示“类HelloJava是公共的应在名为HelloJava.java的文件中声明”比我在旁边喊十遍“要一致要一致”都管用。3.2 main方法程序统一入口public static void main(String[] args)这串东西我第一节课不会展开讲public、static、void各自的意义但有一句话必须让学生记住main方法是程序的入口JVM从main方法的第一行开始执行代码。我用一个类比main方法就像学校的大门。你从大门进学校才能走到操场、教室、食堂。Java程序也是一样不管代码有多少行JVM永远从main方法这一行开始“进门”。至于门前那一串修饰词现在可以当作“规定动作”先背下来等学了方法、静态、返回值之后回头看自然就明白了。第一节课强行把每个单词讲透只会让学生记住一堆“名词解释”却不知道自己写的代码在干嘛。这是初学者最痛苦的地方。我建议只强调两件事第一方法名必须叫main写成mian、mian都没用第二参数String[] args先不管后面学到数组和命令行参数再回来说。3.3 println与System.out输出背后发生了什么System.out.println(Hello, Java);这行是学生第一个亲手“制造”可见结果的地方。我讲这行的顺序是System.out可以简单理解成“标准输出设备”最直接的表现就是你的电脑屏幕println是“打印一行并换行”括号里的内容会被原样输出到屏幕上括号里的双引号表示这是一个字符串双引号里的文字是什么屏幕上显示什么。一个很实用的课堂演示是让学生把双引号里的Hello, Java改成自己的名字再运行一遍。他们第一次发现原来改代码不是靠蒙而是有明确规则的——规则就是字面文本放在双引号里改了它输出就变。我还会提醒分号的事。Java里一句话结束要加分号就像中文一句话结束要加句号。很多新手的第一个报错就是忘记分号报错信息会指向下一行学生很容易懵。我一般会告诉他们看到报错信息时先往上一行看很多时候罪魁祸首就在那里。4. 用变量和字符串拼接把代码“用起来”4.1 变量是贴了标签的箱子第一节课如果只停留在HelloWorld学生很容易觉得Java就是“把字打出来”没意思。所以我一般在后半段引入变量让代码“活”起来。我给变量的定义很生活化变量就是一个贴了标签的箱子。箱子的标签是变量名比如age箱子能装的东西由类型决定比如int只能装整数String只能装一串文字。第一次赋值就是把东西放进箱子后面再赋值就是把箱子里的东西换掉。演示代码我常用这个public class Introduce { public static void main(String[] args) { String name 小明; int age 18; String city 杭州; System.out.println(我叫 name 今年 age 岁来自 city 。); age 19; System.out.println(明天我就 age 岁了。); } }运行完之后我会指着输出问学生为什么第一行里面age是18第二行变成了19因为他们看到age 19;把箱子里的旧值换掉了。这个过程直接说明了“变量”为什么叫“变”量。4.2 字符串拼接与常见误区用加号连接文字和变量这个知识点看着简单但新手的错误率很高。典型误区有两个第一分不清什么时候加双引号。我叫带双引号表示这是个固定的字面文本name不带双引号表示要取出变量里的值。总有学生会写成我叫 name结果屏幕上真的输出一个“name”而不是“小明”。这个错误一出现全班都笑了但笑完印象也深了。第二数字和字符串相加容易混乱。比如System.out.println(今年 age 岁);里age是int类型但Java在做字符串拼接时会自动把它转成“18”这个字符串再拼起来所以输出是正常的。可如果写成int x 今年 age;就会编译报错因为字符串不能直接塞进int变量。第一节课我一般不做这种混合加法演示但我会提醒字符串加号拼接和数字加法是两个不同的场景不能无脑套。4.3 课后练习做一个自我介绍卡第一节课的作业我一般不会让全班都敲HelloWorld而是让他们用它延伸出一个“自我介绍卡”定义姓名、年龄、城市三个变量用一次println输出一整段介绍文字再留一行专门改年龄后再次输出。这个练习的好处是可以检验三件事变量是否定义对、字符串拼接是否会用、println是否没被写错。基础好的学生五分钟就做完了基础弱的学生可能会卡在大小写和引号上但正好在课后暴露问题下节课讲评效率更高。我还会额外布置一个“进阶选做题”定义一个整数变量给它赋一个两位数然后尝试输出它的个位数和十位数。这题不需要用到取余和除法学生可以用最笨的办法比如定义两个新变量来算。主要是让他们提前感受“程序能帮我做事”而不是“程序只会打印”的差别。5. 第一课最容易翻车的问题排查速查表5.1 编译报错类名与文件名不一致这是我在教室里听到频率最高的一种报错。现象是Javac编译时直接红字提示“类Foo是公共的应在名为Foo.java的文件中声明”。原因就一个文件里public class的名字和文件名不一致。解决方案也简单要么把文件重命名成类名.java要么把类名改成文件名。我建议学生先搞清哪个是类名、哪个是文件名再动手改。还有一个坑是文件名其实叫HelloWorld.java.txtWindows默认会隐藏真实扩展名肉眼看不出来。第一节课我会专门教他们打开“显示文件扩展名”不然这种问题能卡一节课。5.2 运行报错找不到或无法加载主类这个报错我归纳过原因基本是三种运行时带了.class后缀把java HelloWorld.class写成了这样当前目录不对java命令找不到这个类要先cd到.java文件所在目录类名大小写不对Java是严格区分大小写的helloworld和HelloWorld是两个名字。排查顺序建议是这样先看是不是手滑加上了.class再看当前目录对不对最后确认类名首字母大小写。这个流程熟记之后以后遇到类似报错都能自己解决。5.3 版本报错源发行版17需要目标发行版17这个报错在IDE里出现的频率非常高尤其是学生自己下载了新版JDK、但IDE项目里还指向旧版本的时候。现象是编译时提示“java: 警告: 源发行版 17 需要目标发行版 17”或者直接编译失败。原因一般是编译器的Java版本设置和项目SDK版本对不上。解决步骤也很固定在IDEA里打开File → Project Structure → Project把Project SDK设置为已安装的JDK版本打开Settings → Build, Execution, Deployment → Java Compiler把Target bytecode version设成一样的版本如果学生用Maven再去pom.xml里确认maven.compiler.source和maven.compiler.target和JDK版本一致。我在课堂上会提前给学生打预防针这个报错不是你代码写错了是你IDE的版本设置打架属于工具问题别慌。5.4 中文乱码控制台输出乱码怎么办第一节课很多同学喜欢在print里写中文结果在命令行运行时出现一堆乱码。原因是源码文件保存的编码和运行环境的编码没对上。早期Windows命令行默认编码是GBK而现代编辑器通常把文件保存成UTF-8两边一冲突就乱码。我的建议是这样的在IDE里运行最省事IDEA和VS Code都默认UTF-8基本不会乱。如果一定要用命令行跑可以在编译时指定编码javac -encoding UTF-8 HelloWorld.java java HelloWorld如果是Windows命令行窗口本身显示乱码可以临时把控制台切到UTF-8编码执行chcp 65001再重新跑一次。这个方法对很多乱码问题都有效。我经常跟学生讲乱码问题本质上不是Java的问题是字符编码的“世界观”不同以后做网页、读写文件时还会遇到现在先会用解决办法就行。6. 给新人和授课者的几点经验6.1 新人最容易犯的三个学习心态错误第一个是“试图第一节课搞懂每一个单词”。我见过太多学生把public static void main抄到笔记本上然后像背单词一样反复背。这完全没必要。第一节课的核心模型是“写代码-编译-运行-输出”那些修饰词先当作格式背下来学到后面自然会懂。第二个是“害怕报错”。很多学生一看到红色错误提示就觉得是自己笨。实际上报错是编译器在告诉你“我哪里没看明白”这是程序开发里最正常的反馈。我常跟学生说一句话不报错的代码不叫成熟叫没运行过。第一节课就敢把代码改乱然后看着报错信息自己查这种习惯比会写十行通关代码都值钱。第三个是“复制粘贴一时爽”。课堂上我明确要求学生前两周必须手敲代码不允许复制我的示例。因为Java的报错很多和输入有关中文标点、大小写、多空格少空格手敲才能暴露出问题。复制粘贴会把这一层练习彻底屏蔽掉。6.2 授课者/自学者都能用的小技巧故意制造错误我带班时总会在第一节课结束前留一个“故意弄坏程序”的环节。我让同桌两人一组互相把自己已经能跑通的代码改出一个错误然后交给对方去排查修复。这个环节的魔力在于学生第一次发现原来程序坏掉不可怕而且报错信息真的会告诉他问题在哪。这个做法也适合自学的人。你完全可以跑通HelloWorld后自己改三处地方删掉一个分号、把main改成mian、把System首字母改成小写然后逐个看报错提示。这个过程比连续写十个HelloWorld更能帮你理解Java的语法规则。我自己的经验是一个能主动制造错误并从报错里找到原因的人后面学到异常、框架、微服务时都远比只会照着敲的人抗造。第一节课到这里核心的事情其实只有一件让学生亲手跑通一次程序并且不害怕报错。技术深度可以慢慢加知识点可以一点点铺但“我能学会、我敢动手、我懂看报错”这三种感觉必须在第一节就种下去。如果你正打算带Java第一节课或者准备自学Java别急着把全书第一章背完。先把一个最简单的类写出来跑起来然后再拆开一句一句弄明白它。程序跑通那一刻的兴奋感才是你接下来几个月最好的学习燃料。