学习前提
本章可作为该语言的起点,不要求先学网页开发。
本课完成后你能做什么
区分源代码、字节码和运行时,完成第一次可复现运行。
先理解机制
JDK包含javac编译器和java启动器。javac把.java源文件转换为.class字节码;java再启动虚拟机执行类。编辑器保存成功并不代表编译成功。
本课使用传统入口public static void main(String[] args)。public允许访问,static表示不必先创建对象,void表示不返回值,args保存命令行参数。先理解入口职责,再逐步学习修饰符。
public类名Main必须与Main.java一致,大小写也一致。编译失败时先看第一条错误的位置;修复后重新编译,避免误运行上一次残留的.class文件。
可运行示例
使用JDK 21。将代码保存为Main.java,在独立练习目录执行 javac -encoding UTF-8 Main.java,再执行 java Main。每章独立运行,不把多个public Main类放进同一文件。
public class Main {
public static void main(String[] args) {
String course = "Java";
int minutes = 25;
System.out.println(course + ": " + minutes);
System.out.println("arguments=" + args.length);
}
}
推演与验证
无参数运行得到Java: 25和arguments=0。再执行java Main one two,第二行变为arguments=2;参数没有修改源文件。
常见错误与边界
执行java Main,不写Main.class;本系列采用先编译再运行的流程。若javac不存在,应安装或定位JDK,而不是反复修改代码。
动手练习
修改课名和分钟数,再故意删除分号观察编译错误,恢复后重新运行。
参考解法与理由
变量值变化只影响输出。删除声明末尾分号会造成语法错误;补回并确认javac成功,再执行java。
深入实验:编译通过后运行的是哪一个类
编辑器中代码已改,终端输出却没变,经常是运行了旧class文件或错误目录。把源文件与编译输出分开,再显式传classpath,可以让构建过程可解释。将下方文件保存为独立练习目录的Main.java,用JDK 21执行javac -encoding UTF-8 -d out Main.java,然后java -cp out Main。
public class Main {
public static void main(String[] args) {
String version = "lesson-v2";
System.out.println(version);
System.out.println(args.length);
}
}
预期观察
不带参数时输出lesson-v2和0。运行java -cp out Main HTML CSS时,第二行变成2。
原因、取舍与适用边界
javac处理源码并生成字节码;java -cp out Main按类名从指定根目录加载类,Main不是Main.java文件路径。修改version后必须重新编译再运行。如果出现UnsupportedClassVersionError,检查编译器与运行时版本,不要随机删除业务代码。javac -version和java -version分别确认两端;设置JAVA_HOME也不保证PATH里最先找到的命令就已改变。
进阶练习
把类放进package study;后,运行命令为什么也要变化?
解法与推理
使用相同-d out编译后得到out/study/Main.class;运行java -cp out study.Main,classpath仍指向包层级根目录out。不要把classpath改成out/study再运行Main,那会把类的二进制名称与文件位置混淆。