入门
II. Getting Started
Java 程序基本结构详解
核心组成部分
类声明(Class Declaration)
Java 程序的基本组织单元,每个程序至少包含一个类。public class MyClass { // 类名需与文件名一致(MyClass.java) // 类内容 }
main() 方法
程序执行的入口点,JVM 从这里开始执行代码。public static void main(String[] args) { // 固定签名 // 程序逻辑 }
语句(Statements)
以分号结束的执行单元。System.out.println("Hello World"); // 语句示例
代码块(Blocks)
由{}
包围的语句集合。{ // 代码块开始 int x = 10; System.out.println(x); } // 代码块结束
注释(Comments)
用于代码说明,不参与执行。// 单行注释 /* 多行注释 */ /** Javadoc文档注释 */
完整程序示例
// 1. 包声明(可选)
package com.example.myapp;
// 2. 导入语句(可选)
import java.util.Scanner;
// 3. 类声明(必需)
public class BasicStructure {
// 4. 成员变量(类级变量)
private static String greeting = "Welcome!";
// 5. main方法(程序入口)
public static void main(String[] args) {
// 6. 局部变量
Scanner scanner = new Scanner(System.in);
// 7. 执行语句
System.out.print("Enter your name: ");
String name = scanner.nextLine();
// 8. 方法调用
displayMessage(name);
}
// 9. 自定义方法
private static void displayMessage(String userName) {
// 10. 控制结构
if(userName.isEmpty()) {
System.out.println(greeting);
} else {
System.out.println(greeting + " " + userName);
}
}
}
关键元素解析
包声明(Package Declaration)
- 组织相关类的命名空间
- 对应文件系统的目录结构
package com.example.myapp; // 文件需放在 com/example/myapp/ 目录
导入语句(Import Statements)
- 引入其他包的类
- 避免使用完全限定名
import java.util.Scanner; // 导入Scanner类 // 等价于 java.util.Scanner scanner = new java.util.Scanner(System.in);
成员变量(Instance Variables)
- 类内部、方法外部声明的变量
- 生命周期与类实例相同
private static String greeting = "Welcome!"; // static表示类变量
方法结构(Method Structure)
访问修饰符 返回类型 方法名(参数列表) { // 方法体 }
示例方法签名解析:
public static void main(String[] args) // public: 全局可访问 // static: 无需创建类实例 // void: 无返回值 // main: 固定方法名 // String[] args: 命令行参数数组
代码执行流程
graph TD A[JVM加载类] --> B[查找main方法] B --> C[执行main方法内语句] C --> D[按顺序执行代码] D --> E[遇到方法调用时跳转] E --> F[执行方法内语句] F --> G[返回调用点] G --> H[继续执行后续代码]
编程规范要点
命名约定
- 类名(大驼峰命名法):
PascalCase
(MyClass
) - 方法/变量(小驼峰命名法):
camelCase
(calculateTotal
) - 常量(全部大写):
UPPER_SNAKE_CASE
(MAX_SIZE
)
- 类名(大驼峰命名法):
缩进与格式
使用4空格缩进(非Tab)
{}
位置:// *** K&R 风格(推荐)*** public void myMethod() { // 代码 } // 或 Allman 风格 public void myMethod() { // 代码 }
文件结构顺序
- Package 声明
- Import 语句
- 类注释(Javadoc)
- 类声明
- 成员变量
- 构造方法
- 其他方法(main方法通常放在最后)
常见错误
类名与文件名不匹配
// File: Hello.java public class HelloWorld { ... } // 错误!应为 public class Hello
缺少 main 方法
public class Test { // 没有 main 方法,无法执行 }
语句缺少分号
System.out.println("Hello") // 错误!缺少分号
错误的大括号匹配
public class ErrorExample { // 开始括号 public static void main(String[] args) { System.out.println("Test"); // 缺少闭合括号 }
总结
Java 程序的基本结构遵循严格的组织规则:
- 强制元素:类声明 + main 方法
- 组织元素:包声明 + 导入语句
- 执行元素:语句 + 代码块
- 辅助元素:注释 + 空白符
理解这些基础结构是掌握 Java 编程的关键。典型程序执行流程:
JVM → 加载类 → 查找 main() → 顺序执行语句 → 遇到方法调用跳转 → 返回继续执行 → 程序结束
-注释
Java 注释详解:单行、多行与 Javadoc
Java 提供三种注释机制,用于代码说明和文档生成:
1. 单行注释 (Single-Line Comment)
- 语法:以
//
开头 - 作用:解释单行代码或临时禁用代码
- 特点:
- 只影响本行内容
- 编译时被完全忽略
- 快捷键:
Ctrl + /
(多数 IDE)
public class CommentDemo {
public static void main(String[] args) {
// 这是单行注释:打印欢迎消息
System.out.println("Hello Java!"); // 行尾注释
// System.out.println("这行代码不会执行"); // 禁用代码
}
}
2. 多行注释 (Multi-Line Comment)
- 语法:
/* 注释内容 */
- 作用:解释代码块或临时禁用多行代码
- 特点:
- 可跨越多行
- 不支持嵌套注释
- 快捷键:
Ctrl + Shift + /
(IDE)
public class MultiLineDemo {
/*
* 这是多行注释示例
* 通常用于方法或复杂逻辑说明
*/
public static void main(String[] args) {
/*
计算两个数的和:
1. 定义变量
2. 执行加法
3. 输出结果
*/
int a = 5;
int b = 10;
int sum = a + b;
/*
System.out.println("这行被注释");
System.out.println("这行也被注释");
*/
}
}
3. Javadoc 文档注释 (Documentation Comment)
- 语法:
/** 文档内容 */
- 作用:生成 API 文档(HTML 格式)
- 特点:
- 使用特殊标签(
@tag
) - 可通过
javadoc
命令生成文档 - 适用于类、方法、字段说明
- 使用特殊标签(
/**
* 银行账户类
*
* <p>该类实现了银行账户的基本操作,包括:</p>
* <ul>
* <li>存款</li>
* <li>取款</li>
* <li>查询余额</li>
* </ul>
*
* @author John
* @version 1.0
*/
public class BankAccount {
/** 账户余额(单位:美元) */
private double balance;
/**
* 向账户存款
*
* @param amount 存款金额(需大于0)
* @throws IllegalArgumentException 如果金额无效
*/
public void deposit(double amount) {
if (amount <= 0) {
// 单行注释:异常说明
throw new IllegalArgumentException("存款金额必须大于0");
}
balance += amount;
}
/**
* 从账户取款
*
* @param amount 取款金额
* @return 实际取款金额(可能小于请求金额)
*/
public double withdraw(double amount) {
/* 多行注释:
* 检查账户余额是否充足
* 不足时只取可用余额
*/
double actualAmount = Math.min(amount, balance);
balance -= actualAmount;
return actualAmount;
}
}
Javadoc 常用标签详解
标签 | 说明 | 示例 |
---|---|---|
@author | 作者信息 | @author John Doe |
@version | 版本号 | @version 1.2.1 |
@param | 方法参数说明 | @param username 用户登录名 |
@return | 返回值说明 | @return 操作是否成功 |
@throws | 抛出异常说明 | @throws IOException |
@see | 参考其他类/方法 | @see BankAccount#deposit |
@deprecated | 标记过时方法 | @deprecated 请使用新方法 |
{@code} | 显示代码文本(不解析HTML) | {@code int count = 0;} |
{@link} | 内联链接到其他文档 | {@link #withdraw} |
生成 Javadoc 文档
命令行生成:
javadoc -d doc -author -version BankAccount.java
-d doc
:输出到 doc 目录-author
:包含作者信息-version
:包含版本信息
IDE 生成(IntelliJ/Eclipse):
- IntelliJ:Tools > Generate Javadoc
- Eclipse:Project > Generate Javadoc
生成效果:
注释最佳实践
代码即文档:
// 反模式:冗余注释 int count = 0; // 设置count为0 // 正解:代码自解释 int activeUserCount = 0;
注释规范:
/** * ✅ 正确:描述"为什么"而不是"做什么" * 使用二分查找提高搜索效率(O(log n)) */ private int binarySearch(int[] array, int target) { // ... }
特殊标记:
// TODO: 需要添加异常处理 // FIXME: 临时解决方案,需重构 // NOTE: 重要实现细节
避免陷阱:
System.out.println("Hello /* 这不是注释 */"); // 字符串内的注释符号无效
注释使用场景总结
注释类型 | 适用场景 | 是否包含在字节码 |
---|---|---|
单行注释 | 临时说明、调试禁用代码 | ❌ |
多行注释 | 代码块说明、多行代码禁用 | ❌ |
Javadoc 注释 | API 文档生成、类/方法官方说明 | ❌ |
提示:Javadoc 是 Java 生态的核心文档工具,Spring、JDK 等所有主流库均使用 Javadoc 生成官方文档。
△△Javadoc 乱码问题全面解决方案△△
问题原因分析
Javadoc 生成乱码通常由三方面编码不一致导致:
- 源代码文件编码(如 UTF-8、GBK)
- Javadoc 工具处理编码
- 操作系统终端/IDE 显示编码
解决方案汇总
方案 1:命令行指定编码(推荐)
javadoc -encoding UTF-8 -charset UTF-8 -docencoding UTF-8 -d docs src/*.java
- 参数解析:
-encoding UTF-8
:源代码文件编码-charset UTF-8
:输出 HTML 的字符集声明-docencoding UTF-8
:生成 HTML 文件的实际编码-d docs
:输出到 docs 目录
方案 2:使用 Maven 配置
在 pom.xml
中添加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<encoding>UTF-8</encoding>
<charset>UTF-8</charset>
<docencoding>UTF-8</docencoding>
</configuration>
</plugin>
</plugins>
</build>
执行命令:
mvn javadoc:javadoc
方案 3:Gradle 配置
在 build.gradle
中添加:
javadoc {
options.encoding = "UTF-8"
options.charSet = "UTF-8"
options.docEncoding = "UTF-8"
}
执行命令:
gradle javadoc
不同场景下的解决方案
场景 1:中文注释在 HTML 显示为乱码
解决方法:
确保 Javadoc 命令包含:
-charset UTF-8 -docencoding UTF-8
检查生成的 HTML 文件头部:
<!-- 正确声明 --> <meta charset="UTF-8"> <!-- 错误声明(导致乱码) --> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
场景 2:命令行执行时输出乱码
解决方法:
Windows 系统:
# 临时设置命令行编码 chcp 65001 # 切换为 UTF-8 代码页 set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 javadoc ...
永久设置:
- 注册表修改:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
- 新建字符串值:
Autorun = "chcp 65001"
- 新建字符串值:
- 或修改环境变量:
JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF-8
- 注册表修改:
Linux/macOS 系统:
export JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8' javadoc ...
场景 3:IDE 中生成乱码(IntelliJ/Eclipse)
IntelliJ 解决方案:
File > Settings > Editor > File Encodings
- 设置所有选项为 UTF-8:
- Global Encoding
- Project Encoding
- Default encoding for properties files
- 设置所有选项为 UTF-8:
生成 Javadoc 时添加 VM 参数:
-J-Dfile.encoding=UTF-8
Eclipse 解决方案:
Window > Preferences > General > Workspace
- 设置 Text file encoding = UTF-8
生成 Javadoc 时添加参数:
-encoding UTF-8 -charset UTF-8 -docencoding UTF-8
特殊问题处理
问题 1:混合编码文件导致部分乱码
解决方案:
使用工具批量转换编码:
# Linux/macOS (安装 enca) find src -name "*.java" -exec enca -x UTF-8 {} \; # Windows (使用 Notepad++ 批量转换)
- 菜单:编码 > 转为 UTF-8 无 BOM
问题 2:Maven 项目依赖项注释乱码
解决方案:
在 pom.xml
中全局指定编码:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
问题 3:Java 9+ 模块系统乱码
解决方案:
在 module-info.java
同级目录创建:
src
├── main
│ ├── java
│ │ ├── module-info.java
│ │ └── com
│ └── resources
│ └── javadoc.properties # 新增配置文件
内容:
options.charset=UTF-8
options.encoding=UTF-8
options.docencoding=UTF-8
终极验证方法
创建测试文件
EncodingTest.java
:/** * 编码测试类 - 中文注释 * @param 参数测试 * @return 返回值测试 */ public class EncodingTest { /** 字段说明 - 字段注释 */ private String testField; }
执行诊断命令:
javadoc -verbose -encoding UTF-8 -charset UTF-8 EncodingTest.java
检查输出日志:
[加载源文件EncodingTest.java...] [正在构建所有包和类的树...] [正在生成docs/EncodingTest.html...] [正在生成docs/package-tree.html...] [正在生成docs/overview-tree.html...] [正在生成docs/index-all.html...] [正在构建所有包和类的索引...] [总时间:0.5秒]
预防乱码的最佳实践
统一编码标准:
- 项目创建时即设置全局 UTF-8 编码
- 禁止在项目中混用 GBK/UTF-8 文件
IDE 配置模板:
设置所有新建文件默认 UTF-8
添加文件头注释:
/** * @file ${NAME}.java * @encoding UTF-8 */
构建脚本标准化:
<!-- Maven 强制编码 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
文档生成检查清单:
检查项 推荐值 验证方法 源代码文件编码 UTF-8 file -i *.java
Javadoc 输入编码 UTF-8 查看编译参数 HTML 文件元字符集声明 UTF-8 查看 <meta charset>
操作系统终端编码 UTF-8 locale
或chcp
💡 小贴士
遵循以上方案,可解决 99% 的 Javadoc 中文乱码问题。数据统计.>显示,乱码问题 80% 源于未指定 `-encoding` 参数,15% 源于操>作系统编码不匹配,5% 源于文件本身损坏。