一、什么是内部类?
内部类是指在一个类(外部类)内定义的另一个类。内部类可以访问外部类的所有成员,包括私有成员,从而增强了封装性和代码复用性。
二、内部类的特点
1.访问权限:内部类可以直接访问外部类的公有、受保护和私有成员。
外部类无法直接访问内部类的非公有成员。
2.内存模型:内部类实例隐式持有外部类引用,可能导致内存泄漏,需谨慎处理。
3.生命周期:内部类实例的生命周期与外部类实例相关联,除非使用静态内部类。
4.访问方式:静态内部类可以通过Outer.Inner直接访问,而非静态内部类需要先创建外部类实例。
三、内部类的类型
1.成员内部类:
- 定义在外部类内部。
- 需要外部类实例才能存在。
- 可以访问外部类的所有成员。
2.静态内部类:
- 使用static关键字定义,独立于外部类。
- 不能访问外部类的非静态成员。
3.局部内部类:
- 定义在方法或初始化块中。
- 访问权限受限于其作用域。
4.匿名内部类:
- 匿名实现接口或继承抽象类。
- 无法定义构造器,适合一次性使用。
四、内部类的使用场景
- 封装性:隐藏类的实现细节,防止外部类被误用。
- 代码复用:在特定环境中重用代码。
- Swing编程:处理事件监听器时直接访问外部类变量。
- 嵌套逻辑:当内部逻辑与外部类密切相关时。
五、使用方法
- 1.定义成员内部类:
public class Outer {
private int outerVar = ;
class Inner extends SomeClass implements SomeInterface {
// 内部类实现接口或继承抽象类
public void someMethod() {
System.out.println(outerVar);
}
}
public void createInner() {
new Inner(); // 创建内部类实例,需有外部对象
}
}
- 2.访问外部类成员:
内部类可以直接调用外部类的私有方法和访问私有变量。
- 静态内部类示例:
public class Outer {
static class StaticInner {
public void print() {
System.out.println("Static Inner");
}
}
}
局部内部类示例:
public class Outer {
public void method() {
class LocalInner {
public void localMethod() {
// 方法体
}
}
new LocalInner().localMethod();
}
}
- 匿名内部类示例:
interface OnClickListener {
void onClick();
}
public class Outer {
OnClickListener listener = new OnClickListener() { // 匿名内部类实现接口
@Override
public void onClick() {
System.out.println("Clicked");
}
};
}
六、注意事项
- 内存泄漏:非静态内部类持有外部引用,可能导致资源未释放。
- 访问控制:合理设置权限,避免不必要的暴露。
- 设计原则:尽量减少内部类的嵌套深度,保持代码清晰。