内部类不一定是静态的
Java 内部类分 4 种:成员内部类、静态内部类、局部内部类、匿名内部类,只有加static才是静态内部类。
1. 成员内部类(非静态,最普通)
写在类里面,方法外面,没有 static
class Outer {
// 非静态内部类
class Inner {
}
}
- 依附外部类实例,必须先 new 外部类,才能 new 内部类
java
运行
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
- 可以访问外部类所有成员(包括外部类私有属性)
- 不能拥有 static 变量、static 方法
2. 静态内部类(也叫嵌套类,加 static)
class Outer {
static class StaticInner {
}
}
- 属于外部类本身,不需要外部类对象
Outer.StaticInner inner = new Outer.StaticInner();
- 只能访问外部类static 静态成员,不能直接访问外部实例变量
重点区分: ✅
static class→ 静态内部类 ❌class无 static → 普通成员内部类
3. 局部内部类(方法里面定义,非 static)
写在方法内部,不能用 static 修饰
public void test(){
class LocalInner{
}
}
4. 匿名内部类(非 static)
没有类名,new 接口 / 抽象类直接写,也是非静态。
快速记忆口诀
- 成员内部类:默认非 static,依赖外部对象
- static class 才是静态内部类,不依赖外部对象
- 局部、匿名内部类不能写 static 修饰符
高频易错点
- 普通成员内部类里面不能定义 static 方法,编译报错;静态内部类可以写 static。
- 很多人混淆:接口内部的类默认是
public static,接口里写class A{}等价于public static class A{}。
对比简表
表格
| 类型 | 是否 static | 创建实例方式 | 访问外部类 |
|---|---|---|---|
| 成员内部类 | ❌非静态 | outer.new Inner() | 可访问实例 + 静态 |
| 静态内部类 | ✅static | new Outer.StaticInner() | 仅访问静态 |
| 局部内部类 | ❌不能加 static | 方法内 new | 访问方法 final 变量 + 外部实例 |
| 匿名内部类 | ❌不能加 static | new 接口(){} | 同上 |

200

被折叠的 条评论
为什么被折叠?



