内部类

内部类:理解为定义在类中的类

外部类:包含内部类的类

内部类 只是 编译时概念,编译后会作为独立的字节码文件存在

内部类大致划分为三类

  1. 成员内部类 —> 静态成员内部类非静态成员内部类
  2. 方法内部类
  3. 匿名内部类

静态成员内部类

静态成员内部类:定义在类中、方法体外,采用关键字 static

静态成员内部类 的语法结构:public static class(){}

与独立的 Java 类一样,它可以存在 静态变量、方法,成员变量、方法以及构造方法

  • 静态成员内部类 只可以访问外部类的静态成员
  • 若在 静态成员内部类 中访问外部类的同名静态成员
    • 外部类名. 静态成员名
  • 若需要创建 静态成员内部类 的对象
    • 外部类名. 内部类名 对象名 = new 外部类名. 内部类名 ();

非静态成员内部类

静态成员内部类 相比,非静态成员内部类 没有定义关键字 static

非静态成员内部类 的语法结构:public class(){}

  • 非静态成员内部类 不可以拥有静态的属性、方法,例如 main方法、构造方法
  • 非静态成员内部类 不可以访问外部类的静态属性、方法
  • 外部类在访问 非静态成员内部类 的实例属性、方法时,必须通过它的实例对象
    • new 内部类 (). 属性 / 方法
  • 若内部类需要指定访问外部类的成员变量,this 指代内部类对象
    • 外部类. this. 成员变量
  • 若需要直接创建 非静态成员内部类,则必须先创建外部类对象
    • 外部类. 内部类 对象 = new 外部类. 内部类

值得注意的是

  1. 非静态成员内部类 中,不存在静态相关的属性、代码块
  2. 外部类中的静态方法、代码块也不能访问和使用 非静态成员内部类

理解了 static 静态 与 实例属性、方法,就明白了静态、非静态成员内部类的差异

局部内部类

局部内部类 是定义在方法体中的类,作用范围仅限于当前方法 class 类名 {}

public class Demo{
    class Person{
        // 内部类 Person
    }
}

局部内部类 的使用存在以下几点

  • 局部内部类 的类名不可使用 关键字 staticpublic 等修饰
  • 局部内部类 中的方法所访问的外部方法的局部变量,已经由Java编译器默认前缀 final
  • 局部内部类 的方法只允许访问所在方法的局部变量,不可做修改操作

    • 在使用所在的方法的局部变量时,需要保证局部变量已经初始化

局部内部类访问所在方法的局部变量,要求改局部变量必须使用 final 修饰,在 JDK 8 及以后,由 Java 编译器默认添加

匿名内部类

匿名内部类:不存类名的类,适用于只创建一次的对象

例如,匿名内部类可以应用于一次性线程对象的创建

匿名内部类 的语法结构:new 类名 (){}

  • 匿名内部类 只可以实现一个接口,且必须实现所有方法
  • 匿名内部类 不可以是抽象类,它是具体的实现
  • 匿名内部类 不存在类名,也就没有构造方法,也不存在修饰符

版权声明:本文为wyfyjc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wyfyjc/p/14881936.html