第2章 第一个 Java 程序:Hello World
上一节我们搭建好了开发环境,并跑通了第一个程序。这一节逐行拆解 Hello World 程序,理解 Java 程序的基本结构。
一、完整代码
publicclassHello{publicstaticvoidmain(String[]args){System.out.println("Hello, World!");}}这是 Java 最简单的程序,一共 5 行,却包含了 Java 最重要的几个语法元素。我们逐行分析。这段代码在 JDK 8、JDK 11、JDK 17 下运行结果完全一样,本系列统一按这三个版本讲解,后面遇到版本差异时会单独指出。
二、逐行拆解
1.public class Hello
public:访问修饰符,表示公开的、可被外部访问class:关键字,用来定义一个类Hello:类名,Java 约定类名使用大驼峰命名法(首字母大写)
类名必须与文件名一致(大小写敏感)。文件叫Hello.java,类名就必须是Hello。
2.public static void main(String[] args)
这一行是程序入口。JVM 启动程序时,会寻找并调用这个main方法:
public:JVM 需要从外部调用它,所以必须公开static:静态方法,不依赖对象实例就能被调用void:返回类型,表示该方法不返回任何值main:方法名,固定的程序入口名String[] args:参数,接收命令行传入的参数
javaHello 张三 李四上面的命令会把"张三"、"李四"作为两个元素放进args数组。写个例子验证一下:
publicclassArgsDemo{publicstaticvoidmain(String[]args){System.out.println("共收到 "+args.length+" 个参数");// for 循环逐个打印参数(循环语法后面章节会详细讲)for(Stringarg:args){System.out.println(arg);}}}# 运行:java ArgsDemo 张三 李四# 输出:# 共收到 2 个参数# 张三# 李四如果你用的是 JDK 11 或 JDK 17,运行还有更省事的写法:直接java Hello.java,JDK 会替你完成编译再运行,省去先javac再java两步。这种"单文件源码直接运行"的写法从 JDK 11 才开始支持,JDK 8 下只能先编译再运行。
3.System.out.println("Hello, World!");
System:JDK 自带的系统类out:System 类中的一个标准输出对象println:out 的一个方法,作用是打印一行内容后换行"Hello, World!":字符串字面量,用双引号包裹
分号;表示一条语句的结束。Java 中每行语句末尾都要写分号,漏写会编译报错。
println的参数也可以是变量和表达式,还能用+拼接字符串:
intage=25;System.out.println("我今年 "+age+" 岁");// 输出:我今年 25 岁三、另一个常用输出:print 与 printf
println打印后自动换行,print不换行:
System.out.print("A");System.out.print("B");System.out.println("C");// 输出:ABC(然后换行)printf支持格式化输出:
intage=25;System.out.printf("我今年 %d 岁%n",age);// 输出:我今年 25 岁常用占位符:%d整数、%f小数、%s字符串、%n换行。
四、注释
注释不参与编译,只给人看,是良好代码习惯的必备部分:
// 单行注释:以两个斜杠开头/* * 多行注释: * 可以写多行说明 *//** * 文档注释:可用 javadoc 工具生成 API 文档 * @author 作者 */文档注释还能用javadoc工具生成 API 文档(HTML),JDK 自带的System、String官方文档就是这么生成的。常用标签:
/** * 计算两个整数的和 * @param a 第一个加数 * @param b 第二个加数 * @return 两数之和 */publicstaticintadd(inta,intb){returna+b;}@param描述参数,@return描述返回值,@author写作者。
五、代码书写规范(重要)
- 类名大驼峰:
StudentInfo - 方法名、变量名小驼峰:
getName、studentAge - 常量全大写加下划线:
MAX_VALUE - 缩进统一用 4 个空格,不要用 Tab
- 大括号左半
{放在行尾,右半}单独成行
规范不是语法强制,但代码是写给人看的:别人要读你的代码,三个月后你也要读自己的代码。IDEA 里⌘⌥L(macOS)/Ctrl+Alt+L(Windows)可以一键格式化。
六、可能遇到的报错
| 报错 | 原因 |
|---|---|
类 Hello 是公共的, 应在名为 Hello.java 的文件中声明 | 类名与文件名不一致 |
错误: 找不到或无法加载主类 | 运行命令写错类名,或没先编译 |
';' 应为 | 漏写了分号 |
七、扩展知识
1. 为什么 main 必须是 public static void main(String[] args)
这四个词一个都不能少,各有各的道理:
- public:JVM 从类外部调用它,不是 public 会报
Main method not public; - static:JVM 启动时还没创建对象,main 必须静态才能不依赖对象调用;
- void:main 是程序入口,返回值没有接收方,所以返回类型是 void;
- String[] args:命令行参数从这里传进程序。
args名字可改,String[]类型不能变——JVM 只认这个签名。
2. 编译与运行的本质
拆开看两步:
javac Hello.java:检查语法,通过后生成字节码Hello.class;java Hello:JVM 加载字节码并逐条执行,遇到System.out.println就调用操作系统 API 打印文字。
Java 的"编译"产出的是字节码而非机器码,不能直接在 CPU 上跑,必须由 JVM 解释执行,JVM 还会把热点代码用 JIT 编译成机器码提速——这就是"一次编译、到处运行"的根本原因。
3. IDEA 里点运行按钮,背后发生了什么
IDEA 里点绿色三角形运行,其实替我们做了手动的事:
- 自动调用
javac编译,输出到项目out目录(相当于javac Hello.java); - 调用
java启动 JVM 运行主类(相当于java Hello); - 把输出显示在底部的 Run 窗口里。
所以运行前要先保存(⌘S),否则运行的是旧版本。
4. 注释规范:Javadoc
Javadoc 是 Java 官方的文档注释规范,配合javadoc工具使用:
javadoc-ddoc Hello.java# 在 doc 目录下生成 API 文档(HTML)生成后浏览器打开doc/index.html即可。日常建议:类名上方写用途并标@author;方法上方用@param、@return说明参数和返回值。
八、易错点
1. 大小写写错
// ❌ System 写成了 system,out 写成了 Outsystem.out.println("hi");System.Out.println("hi");// ✅ Java 严格区分大小写System.out.println("hi");2. main 拼成 mian
// ❌ 拼写错误,JVM 找不到入口,运行时报"找不到或无法加载主类"publicstaticvoidmian(String[]args){}// ✅ main 是固定写法publicstaticvoidmain(String[]args){}3. 漏写分号
// ❌ 语句末尾没有分号System.out.println("hi")// ✅ 每条语句以分号结束,编译报错:';' 应为System.out.println("hi");4. main 方法少了 static
// ❌ 编译能通过,但运行时报错:main 方法不是 static 的publicvoidmain(String[]args){}// ✅ static 不能省publicstaticvoidmain(String[]args){}5. 中文乱码(编码问题)
// ❌ 源码用 GBK 保存,编译器按 UTF-8 读取,中文变成乱码System.out.println("你好");// ✅ 统一用 UTF-8 保存源码;命令行编译时显式指定编码// javac -encoding UTF-8 Hello.javaWindows 记事本另存为时选"UTF-8";IDEA 默认就是 UTF-8 一般不会遇到,但命令行手工编译时乱码很常见,加-encoding UTF-8即可。
九、小结
- Java 程序 = 类 + main 方法
- main 是程序入口,写法固定:
public static void main(String[] args) println打印换行,print不换行,printf格式化输出- 类名与文件名必须一致
- 注释分三种:单行、多行、文档注释(Javadoc)
- 报错不可怕:对照"可能遇到的报错"表格排查
下一节开始学习变量与数据类型。
下一篇:第3章 变量与数据类型