🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 内部类 > 原文: [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)