内部类
Java 嵌套类、非静态内部类、静态内部类、私有内部类的用法
Java 一个类中可以嵌套另外一个类,语法格式如下:
class OuterClass { // 外部类
// ...
class NestedClass { // 嵌套类,或称为内部类
// ...
}
}
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。 嵌套类有两种类型:
- 非静态内部类
- 静态内部类
非静态内部类
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。 由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
以上实例执行输出结果为:
15
私有的内部类
内部类可以使用 private 或 protected 来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符:
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
以上实例 InnerClass 设置为私有内部类,执行会报错:
MyMainClass.java:12: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
静态内部类
静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它:
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
以上实例执行输出结果为:
5
注意:静态内部类无法访问外部类的成员。
从内部类访问外部类成员
内部类一个高级的用法就是可以访问外部类的属性和方法:
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
以上实例执行输出结果为:
10
局部内部类
局部内部类定义在方法体内部,作用域仅限于该方法:
class OuterClass {
void outerMethod() {
int localVar = 100; // 必须是 effectively final 才能被局部内部类访问
// 局部内部类:定义在方法内部
class LocalInner {
void display() {
System.out.println("访问局部变量:" + localVar);
}
}
LocalInner inner = new LocalInner();
inner.display(); // 访问局部变量:100
}
}
四种内部类速查
| 类型 | 特点 | 典型用途 |
|---|---|---|
| 非静态内部类 | 持有外部类引用,可访问外部类所有成员 | 实现与外部类紧密耦合的逻辑 |
| 静态内部类 | 不持有外部类引用,类似于独立的顶级类 | 工具类、Builder 模式 |
| 局部内部类 | 定义在方法内,作用域仅限该方法 | 一次性使用的辅助逻辑 |
| 匿名类 | 无类名,创建时即实例化,通常实现接口 | 事件监听、回调(现代 Java 多用 Lambda 替代) |