入门

II. Getting Started

Java 程序基本结构详解

核心组成部分

  1. 类声明(Class Declaration)
    Java 程序的基本组织单元,每个程序至少包含一个类。

    public class MyClass {  // 类名需与文件名一致(MyClass.java)
        // 类内容
    }
  2. main() 方法
    程序执行的入口点,JVM 从这里开始执行代码。

    public static void main(String[] args) {  // 固定签名
        // 程序逻辑
    }
  3. 语句(Statements)
    以分号结束的执行单元。

    System.out.println("Hello World");  // 语句示例
  4. 代码块(Blocks)
    {} 包围的语句集合。

    {  // 代码块开始
        int x = 10;
        System.out.println(x);
    }  // 代码块结束
  5. 注释(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);
        }
    }
}

关键元素解析

  1. 包声明(Package Declaration)

    • 组织相关类的命名空间
    • 对应文件系统的目录结构
    package com.example.myapp;  // 文件需放在 com/example/myapp/ 目录
  2. 导入语句(Import Statements)

    • 引入其他包的类
    • 避免使用完全限定名
    import java.util.Scanner;  // 导入Scanner类
    // 等价于 java.util.Scanner scanner = new java.util.Scanner(System.in);
  3. 成员变量(Instance Variables)

    • 类内部、方法外部声明的变量
    • 生命周期与类实例相同
    private static String greeting = "Welcome!";  // static表示类变量
  4. 方法结构(Method Structure)

    访问修饰符 返回类型 方法名(参数列表) {
        // 方法体
    }
    • 示例方法签名解析:

      public static void main(String[] args)
      // public: 全局可访问
      // static: 无需创建类实例
      // void: 无返回值
      // main: 固定方法名
      // String[] args: 命令行参数数组
  5. 代码执行流程

      graph TD
      A[JVM加载类] --> B[查找main方法]
      B --> C[执行main方法内语句]
      C --> D[按顺序执行代码]
      D --> E[遇到方法调用时跳转]
      E --> F[执行方法内语句]
      F --> G[返回调用点]
      G --> H[继续执行后续代码]
    

编程规范要点

  1. 命名约定

    • 类名(大驼峰命名法):PascalCaseMyClass
    • 方法/变量(小驼峰命名法):camelCasecalculateTotal
    • 常量(全部大写):UPPER_SNAKE_CASEMAX_SIZE
  2. 缩进与格式

    • 使用4空格缩进(非Tab)

    • {} 位置:

      // *** K&R 风格(推荐)***
      public void myMethod() {
          // 代码
      }
      
      // 或 Allman 风格
      public void myMethod()
      {
          // 代码
      }
  3. 文件结构顺序

    1. Package 声明
    2. Import 语句
    3. 类注释(Javadoc)
    4. 类声明
    5. 成员变量
    6. 构造方法
    7. 其他方法(main方法通常放在最后)

常见错误

  1. 类名与文件名不匹配

    // File: Hello.java
    public class HelloWorld { ... }  // 错误应为 public class Hello
  2. 缺少 main 方法

    public class Test {
        // 没有 main 方法,无法执行
    }
  3. 语句缺少分号

    System.out.println("Hello")  // 错误缺少分号
  4. 错误的大括号匹配

    public class ErrorExample {  // 开始括号
        public static void main(String[] args) 
        { 
            System.out.println("Test");
        // 缺少闭合括号 }

总结

Java 程序的基本结构遵循严格的组织规则:

  1. 强制元素:类声明 + main 方法
  2. 组织元素:包声明 + 导入语句
  3. 执行元素:语句 + 代码块
  4. 辅助元素:注释 + 空白符

理解这些基础结构是掌握 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 文档

  1. 命令行生成

    javadoc -d doc -author -version BankAccount.java
    • -d doc:输出到 doc 目录
    • -author:包含作者信息
    • -version:包含版本信息
  2. IDE 生成(IntelliJ/Eclipse):

    • IntelliJ:Tools > Generate Javadoc
    • Eclipse:Project > Generate Javadoc
  3. 生成效果Javadoc 文档示例


注释最佳实践

  1. 代码即文档

    // 反模式:冗余注释
    int count = 0; // 设置count为0
    
    // 正解:代码自解释
    int activeUserCount = 0;
  2. 注释规范

    /**
     * ✅ 正确:描述"为什么"而不是"做什么"
     * 使用二分查找提高搜索效率(O(log n))
     */
    private int binarySearch(int[] array, int target) {
        // ...
    }
  3. 特殊标记

    // TODO: 需要添加异常处理
    // FIXME: 临时解决方案,需重构
    // NOTE: 重要实现细节
  4. 避免陷阱

    System.out.println("Hello /* 这不是注释 */"); // 字符串内的注释符号无效

注释使用场景总结

注释类型适用场景是否包含在字节码
单行注释临时说明、调试禁用代码
多行注释代码块说明、多行代码禁用
Javadoc 注释API 文档生成、类/方法官方说明

提示:Javadoc 是 Java 生态的核心文档工具,Spring、JDK 等所有主流库均使用 Javadoc 生成官方文档。


△△Javadoc 乱码问题全面解决方案△△

问题原因分析

Javadoc 生成乱码通常由三方面编码不一致导致:

  1. 源代码文件编码(如 UTF-8、GBK)
  2. Javadoc 工具处理编码
  3. 操作系统终端/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 显示为乱码

解决方法

  1. 确保 Javadoc 命令包含:

    -charset UTF-8 -docencoding UTF-8
  2. 检查生成的 HTML 文件头部:

    <!-- 正确声明 -->
    <meta charset="UTF-8">
    
    <!-- 错误声明(导致乱码) -->
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

场景 2:命令行执行时输出乱码

解决方法

  1. 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
  2. Linux/macOS 系统

    export JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8'
    javadoc ...

场景 3:IDE 中生成乱码(IntelliJ/Eclipse)

IntelliJ 解决方案

  1. File > Settings > Editor > File Encodings

    • 设置所有选项为 UTF-8
      • Global Encoding
      • Project Encoding
      • Default encoding for properties files
  2. 生成 Javadoc 时添加 VM 参数:

    -J-Dfile.encoding=UTF-8

    IntelliJ 设置

Eclipse 解决方案

  1. Window > Preferences > General > Workspace

    • 设置 Text file encoding = UTF-8
  2. 生成 Javadoc 时添加参数:

    -encoding UTF-8 -charset UTF-8 -docencoding UTF-8

特殊问题处理

问题 1:混合编码文件导致部分乱码

解决方案

  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

终极验证方法

  1. 创建测试文件 EncodingTest.java

    /**
     * 编码测试类 - 中文注释
     * @param 参数测试
     * @return 返回值测试
     */
    public class EncodingTest {
        /** 字段说明 - 字段注释 */
        private String testField;
    }
  2. 执行诊断命令:

    javadoc -verbose -encoding UTF-8 -charset UTF-8 EncodingTest.java
  3. 检查输出日志:

    [加载源文件EncodingTest.java...]
    [正在构建所有包和类的树...]
    [正在生成docs/EncodingTest.html...]
    [正在生成docs/package-tree.html...]
    [正在生成docs/overview-tree.html...]
    [正在生成docs/index-all.html...]
    [正在构建所有包和类的索引...]
    [总时间:0.5秒]

预防乱码的最佳实践

  1. 统一编码标准

    • 项目创建时即设置全局 UTF-8 编码
    • 禁止在项目中混用 GBK/UTF-8 文件
  2. IDE 配置模板

    • 设置所有新建文件默认 UTF-8

    • 添加文件头注释:

      /**
       * @file ${NAME}.java
       * @encoding UTF-8
       */
  3. 构建脚本标准化

    <!-- Maven 强制编码 -->
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
      </plugins>
    </build>
  4. 文档生成检查清单

    检查项推荐值验证方法
    源代码文件编码UTF-8file -i *.java
    Javadoc 输入编码UTF-8查看编译参数
    HTML 文件元字符集声明UTF-8查看 <meta charset>
    操作系统终端编码UTF-8localechcp

💡 小贴士

遵循以上方案,可解决 99% 的 Javadoc 中文乱码问题。数据统计.>显示,乱码问题 80% 源于未指定 `-encoding` 参数,15% 源于操>作系统编码不匹配,5% 源于文件本身损坏。