Java 入门(01):程序结构、关键字与命名规范
更新时间:2026-09-04。本文是
languages/java/beginner/第 1 篇,接 00 · 环境搭建与语法基础。00 篇我们跑通了第一个程序,这一篇不急着写逻辑,先把两件"地基"打牢:一个.java文件里到底有哪些东西,以及每个东西该怎么命名。命名看似小事,却是团队协作和读源码的第一道门槛。
一、解剖一个 .java 文件:由外到内六层
在 00 篇里我们写过 Hello World,现在把一个"结构完整"的源文件拆开看。Java 源文件的内容是严格分层的,从外到内依次是:
package com.example.demo; // ① 包声明(可选,最多 1 行,必须在最前)
import java.time.LocalDate; // ② 导入语句(可选,0~多行)
import java.util.Scanner;
/**
* ③ 类注释(文档注释):说明这个类是干什么的
*/
public class Greeter { // ④ 类声明:一个文件最多一个 public 类
private static final String GREETING = "你好"; // ⑤ 成员(字段/常量)
public static void main(String[] args) { // ⑤ 方法:程序入口
Scanner scanner = new Scanner(System.in); // ⑥ 方法里的语句
System.out.print("请输入名字:");
String name = scanner.nextLine();
System.out.println(GREETING + "," + name + "!今天是 " + LocalDate.now());
}
}这六层的包含关系,用一张分层图看得最清楚:

几条硬规则(违反就编译不过,新手务必记住):
| 规则 | 说明 | 违反后果 |
|---|---|---|
一个 .java 文件最多一个 public 类 | 且这个类名必须与文件名完全一致(含大小写) | 编译报错"类 X 是公共的,应在 X.java 中声明" |
package 必须在最前 | 只能有一行,位于所有类/导入之前 | 编译报错 |
import 在 package 之后、类之前 | 用来引入其他包里的类,java.lang.* 不用导 | 找不到符号 |
可执行程序要有 main 方法 | 签名固定:public static void main(String[] args) | java 启动时报"找不到主方法" |
语句以分号 ; 结尾 | 一条语句结束必须有分号 | 编译报错"需要 ';'" |
对比本站 C 语言入门:C 的最小单位是函数,
main就是一个普通函数;Java 没有"游离在类外"的函数,一切方法和字段都必须写在类里面——这是 Java"纯面向对象"最直观的体现。
二、三种注释:写给人看的话
注释会被编译器忽略,不影响运行,但对读代码的人极其重要。Java 有三种:
// 单行注释:从 // 到行尾,常用于一行说明
/*
* 多行注释:可以跨越多行,
* 常用于暂时注释掉一段代码或块说明。
*/
/**
* 文档注释(Javadoc):以 /** 开头、*/ 结尾,
* 可以用 @param @return 等标签,
* javadoc 工具能把它生成 HTML API 文档。
*/
public int add(int a, int b) {
return a + b; // 行尾注释:说明这一行
}| 注释类型 | 写法 | 用途 |
|---|---|---|
| 单行注释 | // ... | 临时说明、行尾备注 |
| 多行注释 | /* ... */ | 注释掉一段代码、块说明 |
| 文档注释 | /** ... */ | 类/方法的正式说明,配合 @param/@return 生成 API 文档 |
工程习惯:类和公开方法用文档注释(说明"做什么、参数含义、返回值"),方法内部的技巧用单行注释。注释解释"为什么这么写",而不是复述"这行代码干了什么"。
三、标识符与关键字
标识符(identifier) 就是我们自己起的名字——类名、方法名、变量名。规则如下:
- 由字母、数字、下划线
_、美元符$组成; - 不能以数字开头(
int 2x;非法); - 不能是 Java 关键字;
- 区分大小写(
name和Name是两个标识符); - 不能有空格(
int user name;非法)。
关键字(keyword) 是 Java 语言保留、有特殊含义的单词,不能拿来当名字。常用的有:
| 分类 | 关键字 |
|---|---|
| 数据类型 | byte short int long float double char boolean void |
| 流程控制 | if else switch case default for while do break continue return |
| 面向对象 | class interface extends implements new this super abstract static final enum |
| 访问/修饰 | public protected private package import |
| 异常 | try catch finally throw throws |
| 保留字面量 | null true false(同样不能做标识符) |
小坑:
String、System不是关键字,而是java.lang包里的类名;main也不是关键字,只是 JVM 约定的入口方法名。
四、命名规范:让代码"见名知意"
语法上合法的名字不一定是好名字。Java 社区有一套近乎强制的命名约定(naming convention),所有主流代码(包括 Spring、JDK 自身)都遵守:
| 元素 | 约定 | 正确示例 | 反例 |
|---|---|---|---|
| 包名 package | 全小写、点分隔、域名反写 | com.example.order | Com.Example.Order |
| 类名 / 接口名 | 大驼峰(UpperCamelCase),名词 | OrderService、Runnable | order_service、orderservice |
| 方法名 / 变量名 | 小驼峰(lowerCamelCase),动词开头 | getUserById、orderCount | GetUser、order_count |
| 常量 | 全大写、下划线分隔 | MAX_RETRY、DEFAULT_TIMEOUT | maxRetry、MaxRetry |
| 枚举值 | 全大写、下划线分隔 | OrderStatus.PAID | OrderStatus.Paid |
| 泛型类型参数 | 单个大写字母 | T、E、K、V、R | Type、Element |
驼峰命名(CamelCase) 指多个单词连写时,除第一个单词外每个单词首字母大写:
- 大驼峰:
OrderService(每个单词都大写开头)——用于类; - 小驼峰:
orderService(第一个单词小写)——用于方法和变量。
为什么要这么较真?因为 Java 生态高度依赖反射和命名约定:后面的反射与注解专题会讲到,Spring/Jackson 等框架靠 getter 方法名
getXxx()、字段名小驼峰来自动装配和序列化。命名不规范,框架就"认不出"你的代码。这也是 Java 和 Go 命名风格(Go 用 MixedCaps 且字段大小写决定可见性)的一个差异。
两个好名字的标准:① 见名知意——int d; 不如 int elapsedDays;,boolean flag; 不如 boolean isPaid;;② 符合惯例的前缀/后缀——布尔变量常用 is/has/can 开头(isEmpty、hasNext),方法用动词(get/set/create/delete/parse),类型用名词。
五、完整示例:规范长什么样
把上面所有规则合到一个能跑的小程序里(体会"分层 + 命名"):
package com.example.demo;
import java.util.Scanner;
/**
* 体重指数(BMI)计算器:演示规范的程序结构与命名。
*/
public class BmiCalculator {
private static final double UNDERWEIGHT_THRESHOLD = 18.5; // 常量:全大写下划线
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入身高(米):");
double heightMeters = scanner.nextDouble(); // 变量:小驼峰
System.out.print("请输入体重(千克):");
double weightKilograms = scanner.nextDouble();
double bmi = calculateBmi(heightMeters, weightKilograms); // 方法:动词开头
System.out.printf("你的 BMI = %.1f%n", bmi);
if (bmi < UNDERWEIGHT_THRESHOLD) {
System.out.println("偏瘦,注意营养。");
} else {
System.out.println("体重在正常或以上范围。");
}
}
/**
* 计算 BMI = 体重(kg) / 身高(m) 的平方。
* @param heightMeters 身高,单位米
* @param weightKilograms 体重,单位千克
* @return BMI 数值
*/
public static double calculateBmi(double heightMeters, double weightKilograms) {
return weightKilograms / (heightMeters * heightMeters);
}
}编译运行(文件名必须是 BmiCalculator.java):
javac BmiCalculator.java
java BmiCalculator
# 请输入身高(米):1.75
# 请输入体重(千克):68
# 你的 BMI = 22.2
# 体重在正常或以上范围。注意这个文件里:包名全小写、类名大驼峰且与文件名一致、常量全大写、方法/变量小驼峰、公开方法带 Javadoc——这就是一份"符合 Java 规范"的代码该有的样子。
六、常见坑与排查
| 报错/现象 | 原因 | 解法 |
|---|---|---|
类 X 是公共的,应在名为 X.java 的文件中声明 | public 类名与文件名不一致 | 改文件名或类名,使两者完全一致(含大小写) |
需要 ';' / 非法字符 | 语句漏分号,或用了中文标点(;``()) | 用英文半角标点,语句末尾补 ; |
需要 <标识符> | 拿关键字当变量名(如 int class;) | 换名字:int classCount; |
| 框架/JSON 字段对不上 | getter/字段没按小驼峰命名 | 规范命名:getUserName() 对应 userName |
| 变量名以数字开头报非法 | int 1st; | 数字不能开头:int first; |
一句话总结:一个 .java 文件按 package → import → class → 字段/方法 → 语句 分层组织,一个 public 类配一个同名文件;标识符不能以数字开头、不能是关键字;命名遵循"包全小写、类大驼峰、方法变量小驼峰、常量全大写"的约定——这是写出让人和框架都读得懂的 Java 代码的第一步。
下一篇:02 · 基本类型、变量与常量——正式进入 8 种基本类型、字面量、var 与 final 常量,把"数据"这一层讲透。相邻主题:面向对象编程导读。