# 生成代码

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com.cn/help/idea/llms.txt).

> **TL;DR**
> `代码 | 生成`  或 `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))

IntelliJ IDEA 提供多种生成常用代码构造和重复元素的方法，帮助您提高生产力。 这些可以是创建新文件时使用的 [文件模板](using-file-and-code-templates.html)、根据上下文不同应用的自定义或预定义 [实时模板](using-live-templates.html)、各种包装器或字符的自动配对。

此外，IntelliJ IDEA 提供 [代码补全](auto-completing-code.html)和 [Emmet](using-zen-coding-support.html)支持。

本主题介绍了生成特定于 Java 的标准代码结构的方法：构造函数、方法重写和实现、getter 和 setter 等。 前往  `代码 | 生成`  `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))以打开可生成构造的弹出菜单。

## 生成构造函数

IntelliJ IDEA 可以生成一个构造函数，该构造函数使用相应参数的值来初始化特定类字段。

Procedure: 为类生成构造函数

1. 在主菜单中，转到   代码  ，然后选择   生成  （ `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))）。

2. 在   生成   弹出窗口中，点击   构造函数  。

3. 如果类包含字段，请选择要由构造函数初始化的字段，然后点击   OK  。

以下代码片段显示了为类生成构造函数的结果：

```JAVA
public class MyClass {
    int aInteger;
    double bDouble;

    public MyClass(int myAIntegerParam, double myBDoubleParam) {
        aInteger = myAIntegerParam;
        bDouble = myBDoubleParam;
    }
}

```

## 生成委托方法

IntelliJ IDEA 可以生成将行为委托给您类的字段或方法的方法。 这种方法使得在不直接暴露字段或方法的情况下，可以访问字段或方法的数据。

Procedure: 为类生成委托方法

1. 在主菜单中，转到   代码  ，然后选择   生成  （ `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))）。

2. 在   生成  弹出窗口中，点击   委托方法  。

3. 选择目标字段或方法，然后点击   OK  。

4. 选择您希望委托的方法，然后点击   OK  。

以下代码片段显示了在另一个类中委托  `get(i)`  方法和  `Calendar`  类的结果：

```JAVA
Calendar calendar;
public int get(int i) {
    return calendar.get(i);
}

```

## 生成 equals() 和 hashCode() 方法

Java 超类  `java.lang.Object`  提供了两种用于比较对象的方法：

* `public boolean equals(Object obj)` 返回 `true` 如果传递给它作为参数的对象与调用此方法的对象 相等 。 默认情况下，这意味着两个对象存储在相同的内存地址中。

* `public int hashCode()` 返回调用此方法的对象的哈希码值。 在应用程序的一次执行过程中，哈希码不得更改，但在执行之间可能会更改。

> **Note:**
> 通常情况下，如果您重写  `hashCode()`  方法，则有必要重写  `equals()` ，因为  `hashCode()`  的约定是，对于  相等  的对象，它必须产生相同的结果。 如需了解更多信息，请参阅 [Object 类的 API 规范](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Object.html)。

Procedure: 为类生成 equals() 和 hashCode()

1. 在主菜单中，转到   代码  ，然后选择   生成  （ `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))）。

2. 在   生成   弹出窗口中，点击   equals() 与 hashCode()  。

3. 从   模板  列表中选择一个 velocity 模板。

您还可以点击 ![模板设置](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.general.ellipsis.svg)打开 [模板](templates-dialog.html)对话框，在那里您可以选择一个现有的模板或 [创建一个自定义模板](#customize-templates)。

4. 在方法内选择生成的表达式。 将鼠标悬停在问号图标上，以打开提示框，了解每个表达式的优缺点。

![生成 equals() 和 hashCode() 向导](https://resources.jetbrains.com.cn/help/img/idea/2026.3/generate_equals_and_hashCode.png)

5. 点击   下一步  。

6. 请选择应当用于确定相等性的字段，然后点击   下一步  。

7. 选择要用于计算哈希码值的字段。 您只能从上一步中选择的字段中进行选择（用于确定相等性）。 点击   下一步  。

8. 选择包含非空值的字段。 此可选步骤有助于生成的代码避免空值检查，从而提高性能。 点击   完成  。

> **Note:**
> 如果某个类中已经存在  `equals()`  和  `hashCode()`  方法的重写，您将会收到提示，询问是否在生成新的方法之前删除它们。

以下代码段显示了覆盖  `equals()`  和  `hashCode()`  方法的结果：

```JAVA
public boolean equals(Object o){
    if(this==o)return true;
    if(o==null||getClass()!=o.getClass())return false;

    FixedRateCurrencyExchangeService that=(FixedRateCurrencyExchangeService)o;

    if(Double.compare(that.rate,rate)!=0)return false;

    return true;
}

public int hashCode(){
    long temp=rate!=+0.0d?Double.doubleToLongBits(rate):0L;
    return int(temp^(temp>>>32));
}

```

## 生成 getter 和 setter

IntelliJ IDEA 能为您类中的字段生成存取器和变异器方法（  getters  和  setters ）。 生成的方法只有一个参数，这是由 JavaBeans API 规定的。

getter 和 setter 方法的名称是由 IntelliJ IDEA 根据您的 [代码生成命名偏好设置](null)生成的。

Procedure:

1. 在主菜单中，转到   代码  ，然后选择   生成  （ `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))）。

2. 在   生成  弹出窗口中，点击以下其中一项：

* Getter 以生成访问器方法来获取类字段的当前值。

* Setter 用于生成设置类字段值的变异方法。

* Getter 和 Setter 以生成访问器和修改器方法。

3. 请选择要为其生成 getter 或 setter 的字段，然后点击   OK  。

您可以通过点击 ![浏览按钮](https://resources.jetbrains.com.cn/help/img/idea/2026.3/app.general.ellipsis.svg) [添加自定义 getter 或 setter 方法](#customize-templates)，并访问 [Getter/Setter Templates](null)对话框。 如果某个字段不在列表中，那么相应的 getter 和 setter 方法已经为其定义。

如果选择   复制所有注解   选项，字段中的所有适用注解都将复制到新方法或新方法的形参中。 否则，仅复制适用的为 null 性注解。

以下代码片段展示了为一个包含一个字段的类生成 getter 与 setter 方法的结果  `var` ：

```JAVA
public class MyClass {
    int field;

    public int getField() {
        return field;
    }

    public void setField(int field) {
        this.field = field;
    }
}

```

## 生成 toString()

Java 超类的  `toString()` 方法  `java.lang.Object` 返回对象的字符串表示形式。 此方法可用于将任何对象打印到标准输出，例如，快速监控您的代码执行情况。 默认情况下，  `toString()`  返回类的名称，后跟对象的哈希码。 您可以重写它以返回对象字段的值，这样对于您的需要来说可能会更具信息性。

Procedure: 为类重写 toString() 方法

1. 在   代码  菜单上，点击   生成   `Alt+Insert` (Windows), `⌘ N` (macOS), `⌃ N` (IntelliJ IDEA Classic (macOS)), `⌘ N` (macOS System Shortcuts), `Alt+Insert` (XWin), `Alt+Insert` (GNOME), `Alt+Insert` (KDE), `Alt+Insert` (Emacs), `Alt+Insert` (Sublime Text), `⌘ N` (Sublime Text (macOS)), `Alt+Insert` (Visual Studio), `⌘ ⌃ N` (Visual Studio (macOS)), `Alt+Insert` (NetBeans), `Alt+Insert` (Eclipse), `⌘ N` (Eclipse (macOS))。

2. 在   生成  弹出窗口中，点击   toString()  。

3. 配置以下内容：

* 请选择从 模板 列表生成 `toString()` 方法的模板。

* 选择您想在生成的 `toString()` 方法中返回的字段。 按住 `Shift` (Windows), `Shift` (macOS), `Shift` (IntelliJ IDEA Classic (macOS)), `Shift` (macOS System Shortcuts), `Shift` (XWin), `Shift` (GNOME), `Shift` (KDE), `Shift` (Emacs), `Shift` (Sublime Text), `Shift` (Sublime Text (macOS)), `Shift` (Visual Studio), `Shift` (Visual Studio (macOS)), `Shift` (NetBeans), `Shift` (Eclipse), `Shift` (Eclipse (macOS)) 以选择多个成员。 默认情况下，所有可用字段都被选中。 点击 无选择 可生成一个 `toString()` 方法，仅返回类名。

* 如有必要，请选中 插入 @Override 复选框。

* 点击 设置 按钮以打开 [toString() 生成设置](generate-tostring-settings-dialog.html)对话框。 您可以调整行为并 [添加自定义模板](#customize-templates)。

4. 点击   OK  。

如果类中默认已定义  `toString()`  方法，在继续之前将提示您是否要删除该方法。 您可以使用 [toString() 生成设置](generate-tostring-settings-dialog.html) 对话框中的   当方法已存在时   选项组来更改此行为：自动替换现有方法，或生成重复的方法。

以下代码片段显示了一个定义了多个字段的类生成  `toString()` 方法的结果：

```JAVA
public class MyClass {
    private String name;
    private String url;
    private int port;
    private String[] validIPs;
    ...

    public String toString() {
        return "MyClass{" +
            "name='" + name + '\'' +
            ", url='" + url + '\'' +
            ", port=" + port +
            ", validIps=" + Arrays.toString(validIps) +
            '}';
    }
    ...
}

```

以下 [代码检查](code-inspection.html) 与  `toString()`  方法相关：

* 类未重写 'toString()' 方法 可用于识别未定义 `toString()` 方法的类。 此检查使用 [exclude settings](generate-tostring-settings-dialog.html#exclude)忽略不应被转储的字段的类。 另一项设置是使用正则表达式匹配类名来排除某些类。 默认情况下，该选项用于排除任何异常类。

* 字段未在 'toString()' 方法中使用 可用于识别在 `toString()` 方法中未转储的字段。 例如，如果您向类中添加了新字段，但忘记将其添加到 `toString()` 方法中。 [更改此检查的严重性](configuring-inspection-severities.html) 以将错误显示为警告。 这将在编辑器中高亮显示任何未使用的字段，并在滚动条上以黄色标记指示其位置。

## 自定义代码生成模板

用于生成 getter 和 setter 的模板，以及  `equals()` 、  `hashCode()` 和  `toString()` 方法的模板都是用 [Velocity 模板语言](http://velocity.apache.org/)编写的。 虽然您无法修改预定义模板，但您可以添加自己的自定义模板以实现必要的行为。

IntelliJ IDEA 为 Velocity 模板提供了以下变量：

Getter/Setter:

以下变量可用于生成 getters 和 setters 的模板：

|  变量  |  描述  |
| --- | --- |
|   `$java_version`   |  Java 运行时环境 (JRE) 的当前版本。  |
|   `$class`   |  当前类。  |
|   `$helper`   |  提供对各种代码生成帮助程序方法的访问。  |
|   `$settings`   |  提供根据当前代码样式设置名称格式的能力。  |
|   `$field`   |  为其生成 getter 或 setter 的字段。  |

toString():

以下变量可用于生成  `toString()`  方法的模板：

|  变量  |  描述  |
| --- | --- |
|   `$java_version`   |  Java 运行时环境 (JRE) 的当前版本。  |
|   `$class`   |  当前类。  |
|   `$helper`   |  提供对各种代码生成帮助程序方法的访问。  |
|   `$settings`   |  提供根据当前代码样式设置名称格式的能力。  |
|   `$fields`   |  当前类中的字段列表。  |

equals():

以下变量可用于生成  `equals()`  方法的模板：

|  变量  |  描述  |
| --- | --- |
|   `$java_version`   |  Java 运行时环境 (JRE) 的当前版本。  |
|   `$class`   |  当前类。  |
|   `$helper`   |  提供对各种代码生成帮助程序方法的访问。  |
|   `$settings`   |  提供根据当前代码样式设置名称格式的能力。  |
|   `$fields`   |  当前类中的字段列表。  |
|   `$instanceBaseName`   |  调用  `equals()` 方法的对象的预定义名称。  |
|   `$baseParamName`   |   `equals()`  方法参数的预定义名称。  |
|   `$superParamName`   |  适用时，在超类的  `equals()` 方法中的参数名。  |
|   `$checkParameterWithInstanceof`   |  从向导处传递的选项。  |
|   `$superHasEquals`   |  超类是否已声明  `equals()` 。  |

hashCode():

以下变量可用于生成  `hashCode()`  方法的模板：

|  变量  |  描述  |
| --- | --- |
|   `$java_version`   |  Java 运行时环境 (JRE) 的当前版本。  |
|   `$class`   |  当前类。  |
|   `$helper`   |  提供对各种代码生成帮助程序方法的访问。  |
|   `$settings`   |  提供根据当前代码样式设置名称格式的能力。  |
|   `$fields`   |  当前类中的字段列表。  |
|   `$superHasHashCode`   |  超类是否已声明  `hashCode()` 。  |

## 效率提示

Procedure: 使用代码补全

根据当前上下文，IntelliJ IDEA 可以在 [代码补全](auto-completing-code.html)弹出窗口中建议生成相关代码结构。 例如，当文本光标位于 Java 类中时，代码补全弹出窗口将包含对添加 getters、setters、  `equals()` 、  `hashCode()`  和  `toString()`  方法的建议。

![在代码补全弹出窗口中生成 getters 和 toString()](https://resources.jetbrains.com.cn/help/img/idea/2026.3/generate-java-code-completion-popup.png)

