内部类

原文: https://javabeginnerstutorial.com/core-java-tutorial/inner-class/

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

注意:Java 内部类实例可以访问外部类的所有成员(公开,私有和受保护)

创建内部类的语法

  1. //outer class
  2. class OuterClass {
  3. //inner class
  4. class InnerClass {
  5. }
  6. }

内部类的类型

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

普通内部类

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

  1. //outer class
  2. class OuterClass {
  3. //inner class
  4. class InnerClass {
  5. }
  6. }

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

  1. outer.class
  2. inner$outer.class
注意:您无法使用java命令直接执行内部类的.class文件。

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

如何访问内部类

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

通过外部类

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

  1. class OuterClass {
  2. private int i = 9;
  3. // Creating instance of inner class and calling inner class function
  4. public void createInner() {
  5. InnerClass i1 = new InnerClass();
  6. i1.getValue();
  7. }
  8. // inner class declarataion
  9. class InnerClass {
  10. public void getValue() {
  11. // accessing private variable from outer class
  12. System.out.println("value of i -" + i);
  13. }
  14. }
  15. }

从外部类外面

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

  1. class MainClass {
  2. public static void main(String[] args) {
  3. // Creating outer class instance
  4. OuterClass outerclass = new OuterClass();
  5. // Creating inner class instance
  6. OuterClass.InnerClass innerclass = outerclass.new InnerClass();
  7. // Classing inner class method
  8. innerclass.getValue();
  9. }
  10. }

上面的代码也可以替换为

  1. OuterClass.InnerClass innerClass = new OuterClass.new InnerClass();

this关键字

有一些与相关的规则,它引用当前正在执行的对象。 因此,在内部类中,“this”关键字将引用当前正在执行的内部类对象。 但是要获取外部类的代码,请使用“OuterClass.this”。

应用的修饰符

普通内部类将被视为外部类的成员,因此与类相反,它可以具有多个修饰符

  • final
  • abstract
  • public
  • private
  • protected
  • strictfp

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

方法局部内部类

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

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

  1. class OuterClass {
  2. private int i = 9;
  3. // Creating instance of inner class and calling inner class function
  4. public void innerMethod() {
  5. // inner class declarataion inside method
  6. class InnerClass {
  7. public void getValue() {
  8. // accessing private variable from outer class
  9. System.out.println("value of i -" + i);
  10. }
  11. }
  12. //inner class instance creation
  13. InnerClass i1 = new InnerClass();
  14. i1.getValue();
  15. }
  16. }

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

注意:
  • 方法局部内部类可以在定义它的方法内实例化,而不能在其他地方实例化。
  • 方法本地内部类不能使用在其 ID 定义的方法中定义的变量,但仍可以使用实例变量。
  • 如果方法局部变量是“最终的”,则方法局部内部类可以使用它。 (现在变量是最终的)

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

方法局部内部类可以使用修饰符(例如局部变量),因此方法局部内部类可以具有finalabstract

备忘单

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

参考文献