内部类
内部类
内部类:理解为定义在类中的类
外部类:包含内部类的类
内部类
只是 编译时概念
,编译后会作为独立的字节码文件存在
内部类大致划分为三类
- 成员内部类 —>
静态成员内部类
、非静态成员内部类
- 方法内部类
- 匿名内部类
静态成员内部类
静态成员内部类
:定义在类中、方法体外,采用关键字 static
静态成员内部类
的语法结构:public static class(){}
与独立的 Java 类一样,它可以存在 静态变量、方法,成员变量、方法以及构造方法
-
静态成员内部类
只可以访问外部类的静态成员 - 若在
静态成员内部类
中访问外部类的同名静态成员外部类名. 静态成员名
- 若需要创建
静态成员内部类
的对象外部类名. 内部类名 对象名 = new 外部类名. 内部类名 ();
非静态成员内部类
与 静态成员内部类
相比,非静态成员内部类
没有定义关键字 static
非静态成员内部类
的语法结构:public class(){}
-
非静态成员内部类
不可以拥有静态的属性、方法,例如 main方法、构造方法 -
非静态成员内部类
不可以访问外部类的静态属性、方法 - 外部类在访问
非静态成员内部类
的实例属性、方法时,必须通过它的实例对象new 内部类 (). 属性 / 方法
- 若内部类需要指定访问外部类的成员变量,
this
指代内部类对象外部类. this. 成员变量
- 若需要直接创建
非静态成员内部类
,则必须先创建外部类对象外部类. 内部类 对象 = new 外部类. 内部类
值得注意的是
-
非静态成员内部类
中,不存在静态相关的属性、代码块 - 外部类中的静态方法、代码块也不能访问和使用
非静态成员内部类
理解了 static 静态 与 实例属性、方法,就明白了静态、非静态成员内部类的差异
局部内部类
局部内部类
是定义在方法体中的类,作用范围仅限于当前方法 class 类名 {}
public class Demo{
class Person{
// 内部类 Person
}
}
局部内部类
的使用存在以下几点
-
局部内部类
的类名不可使用 关键字static
、public
等修饰 - 被
局部内部类
中的方法所访问的外部方法的局部变量,已经由Java编译器默认前缀final
-
局部内部类
的方法只允许访问所在方法的局部变量,不可做修改操作- 在使用所在的方法的局部变量时,需要保证局部变量已经初始化
局部内部类访问所在方法的局部变量,要求改局部变量必须使用 final 修饰,在 JDK 8 及以后,由 Java 编译器默认添加
匿名内部类
匿名内部类
:不存类名的类,适用于只创建一次的对象
例如,匿名内部类可以应用于一次性线程对象的创建
匿名内部类
的语法结构:new 类名 (){}
-
匿名内部类
只可以实现一个接口,且必须实现所有方法 -
匿名内部类
不可以是抽象类,它是具体的实现 -
匿名内部类
不存在类名,也就没有构造方法,也不存在修饰符