# 内部类

> 原文： [https://javabeginnerstutorial.com/core-java-tutorial/inner-class/](https://javabeginnerstutorial.com/core-java-tutorial/inner-class/)

Java 内部类是类中的类。 内部类实例与外部类具有特殊关系。 这种特殊的关系使内部类可以访问外部类的成员，就好像它们是外部类的一部分一样。

###### 注意：Java 内部类实例可以访问外部类的所有成员（公开，私有和受保护）

## 创建内部类的语法

```java
//outer class
class OuterClass {
//inner class
class InnerClass {
    }
}
```

## 内部类的类型

*   静态
*   方法局部
*   匿名
*   除了这些正常的内部类之外

## 普通内部类

非方法局部，静态方法或匿名方法的内部类是普通内部类。

```java
//outer class
class OuterClass {
//inner class
class InnerClass {
    }
}
```

如果编译以上代码，它将生成两个类文件。

```java
outer.class
inner$outer.class
```

###### 注意：您无法使用`java`命令直接执行内部类的`.class`文件。

由于它不是静态内部类，因此我们不能对其使用`static`关键字。

## 如何访问内部类

内部类只能通过外部类的活动实例进行访问。

### 通过外部类

外部类可以以与普通类成员相同的方式创建内部类的实例。

```java
class OuterClass {
private int i = 9;

// Creating instance of inner class and calling inner class function
public void createInner() {
InnerClass i1 = new InnerClass();
i1.getValue();
}

// inner class declarataion
class InnerClass {
public void getValue() {
// accessing private variable from outer class
System.out.println("value of i -" + i);
}
}
}
```

### 从外部类外面

创建一个外部类实例，然后创建内部类实例。

```java
class MainClass {

public static void main(String[] args) {
// Creating outer class instance
OuterClass outerclass = new OuterClass();
// Creating inner class instance
OuterClass.InnerClass innerclass = outerclass.new InnerClass();
// Classing inner class method
innerclass.getValue();
}
}
```

上面的代码也可以替换为

```java
OuterClass.InnerClass innerClass = new OuterClass.new InnerClass();
```

### `this`关键字

有一些与[相关的规则](https://javabeginnerstutorial.com/core-java-tutorial/this-keyword-java/)，它引用当前正在执行的对象。 因此，在内部类中，“`this`”关键字将引用当前正在执行的内部类对象。 但是要获取外部类的代码，请使用“`OuterClass.this`”。

### 应用的修饰符

普通内部类将被视为外部类的成员，因此与类相反，它可以具有多个[修饰符](https://javabeginnerstutorial.com/core-java-tutorial/non-access-modifiers-in-java/)。

+   `final`
+   `abstract`
+   `public`
+   `private`
+   `protected`
+   `strictfp`

注意：不要与“类”和“内部类”的修饰符混淆。 他们是完全不同的。

## 方法局部内部类

当在外部类的方法内部定义内部类时，它将成为方法局部内部类。

### 用于创建方法局部内部类的语法

```java
class OuterClass {
private int i = 9;

// Creating instance of inner class and calling inner class function
public void innerMethod() {
// inner class declarataion inside method
class InnerClass {
public void getValue() {
// accessing private variable from outer class
System.out.println("value of i -" + i);
}
}
//inner class instance creation
InnerClass i1 = new InnerClass();
i1.getValue();
}
}
```

现在，内部类的定义位于外部类的方法内部。 仍然可以创建外部类的实例，但是只能在定义内部类之后才能创建，如上面所示。

###### 注意：

*   方法局部内部类可以在定义它的方法内实例化，而不能在其他地方实例化。
*   方法本地内部类不能使用在其 ID 定义的方法中定义的变量，但仍可以使用实例变量。
*   如果方法局部变量是“最终的”，则方法局部内部类可以使用它。 （现在变量是最终的）

### 应用于方法局部内部类的修饰符

方法局部内部类可以使用修饰符（例如局部变量），因此方法局部内部类可以具有`final`或`abstract`。

## 备忘单

*   **内部类**是包含在*类*中的成员。
*   **外部类**引用需要启动内部类。
*   内部类有 4 种类型。
*   在方法内定义的内部类是方法局部内部类。
*   方法局部内部类不能访问方法局部变量。
*   `final`和`abstract`是可用于方法内部内部类的唯一修饰符。
*   匿名内部类没有任何名称。
*   具有**静态修饰符**的内部类称为*静态内部类*。
*   静态嵌套类无法访问外部类的非静态成员。

### 参考文献

*   [官方文档](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)

