一、静态内部类
1. 静态内部类的特点
定义方式:在内部类前添加static修饰符,如public static class Inner{}
归属关系:属于外部类本身持有,而非外部类对象
加载机制:与外部类同时加载且只加载一次
本质特征:除了位置在外部类内部外,其他特性与普通类无异
1)创建外部类包
操作步骤:
新建包com.itheima.innerclass2
关闭无关类保持环境整洁
静态内部类 (Static Inner Class / Static Nested Class)
精确定义:在外部类内部,使用
static关键字修饰的类,即为静态内部类。语法形式:
public class OuterClass { // 静态内部类 static class StaticInnerClass { // 成员变量和方法 private int innerField; public void innerMethod() { System.out.println("静态内部类方法"); } } }
关键区分点:
不要将"静态内部类"与"内部类中定义静态成员"混淆:
静态内部类:整个类用
static修饰内部类的静态成员:类本身不是static,但其中的某个成员是static
// ❌ 错误理解:这不是静态内部类!
class Outer {
class Inner {
static int x; // 错误:非静态内部类不能有静态声明
}
}
// ✅ 正确:这才是静态内部类
class Outer {
static class Inner { // 类本身是static
static int x; // 可以,因为Inner是静态类
}
}设计意图理解:Java引入
static修饰内部类,本质上是为了解除内部类对外部类实例的依赖。这使得静态内部类更像一个"寄居"在外部类命名空间下的独立类,而非外部类实例的附属品。从JVM角度看,静态内部类在编译后会生成独立的
OuterClass$StaticInnerClass.class文件,与普通类文件无异,只是类名中包含了外部类的信息内存模型视角:静态内部类对象在堆内存中不包含指向外部类对象的指针,而成员内部类对象内部持有一个指向其外部类对象的引用(通过
OuterClass.this)。性能影响:由于没有额外的引用,静态内部类对象的内存占用略小,垃圾回收时也更为简单(没有循环引用风险)。
static在Java中的核心语义
类级别 (Class Level)
static成员属于类本身,而非类的某个实例。所有实例共享同一份static成员。
加载时机
在类加载时(JVM加载.class文件时)即被初始化,早于任何实例的创建。
记忆技巧:static = "独立存在"
可以把static理解为"自给自足":
静态变量:不依赖对象,直接通过类名访问
静态方法:不能访问实例变量(因为没有this)
静态内部类:不依赖外部类对象,直接通过外部类名访问
特性一:属于外部类本身(类级别)
因为用 static 修饰,所以静态内部类属于外部类这个类,而不是外部类的某个具体对象。
类比理解:如果把外部类看作一栋大楼,那么:
成员内部类 = 大楼里某个房间(依赖具体的住户/实例)
静态内部类 = 大楼的公共设施如电梯、楼梯间(属于大楼本身)
特性二:随外部类加载而加载(仅一次)
当JVM加载外部类的 .class 文件时,静态内部类也会被加载到内存中。这个过程只发生一次。
3)成员内部类的访问外部类成员
成员完整性:静态内部类可拥有普通类的所有成分(字段、方法、构造器等)
代码复用:可直接复用外部类的代码结构
4)创建对象
创建语法:外部类名.内部类名 对象名 = new 外部类名.内部类名()
示例:Outer.Inner in = new Outer.Inner()
原理说明:无需先创建外部类对象,因为静态内部类属于类级别
5)访问外部类的成员

静态成员访问:
可直接访问外部类的静态成员(如schoolName)
可调用外部类的静态方法(如inAddr())
实例成员访问:
直接访问:不能直接访问外部类的实例成员(如height)
间接访问:需先创建外部类对象(如Outer o = new Outer(); o.height)
2. 总结
核心特点:
有static修饰,属于外部类本身
创建格式:外部类名.内部类名 对象名 = new 外部类名.内部类名()
访问规则:
可直接访问外部类静态成员
不能直接访问外部类实例成员
开发选择:
与成员内部类各有利弊,根据需求选择
当内部类不需要访问外部类实例成员时优先使用静态内部类
典型应用:如心脏类应定义为成员内部类(必须依赖人体对象存在)
默认评论
Halo系统提供的评论