电话
400 9058 355
静态内部类是独立于外部类实例的顶层类,不持外部类this引用,可直接实例化且支持static成员;普通内部类则依赖外部类实例、禁止非final static成员,并易致内存泄漏。
静态内部类(static nested class)不是“只能访问静态成员”的普通内部类,而是独立于外部类实例的顶层类——它不持有隐式 this 引用,编译后生成独立的 Outer$StaticInner.class 文件。
普通内部类(非 static)编译时会自动持有一个指向外部类实例的隐式引用(字段名类似 this$0),因此必须依附于外部类实例才能创建;而静态内部类没有这个引用,可直接通过 Outer.StaticInner 实例化,甚至可在外部类尚未初始化时使用。
static 成员(除 static final 常量);静态内部类可以自由定义 static 字段、方法、嵌套类
static 上下文中直接 new(如 static 方法、静态代码块);静态内部类可以NotSerializableException;静态内部类无此风险当某个类逻辑上紧密属于外部类,但又不需要访问外部类的实例成员时,静态内部类是更优封装选择。它比顶层类更能表达“归属关系”,又比普通内部类更轻量、无内存泄漏隐患。
HashMap 的 Node、TreeMap 的 Entry 都是 static 的Builder 类:如 AlertDialog.Builder,避免暴露给全局命名空间WeakReference 是 Handler / AsyncTask 的标准规避方案声明只需在 class 前加 static;访问时无需外部类实例,但需注意访问权限控制——默认包级可见,若为 private,则仅外部类可构造。
public class Config {
private static final String VERSION = "1.2.0";
public static class Builder {
private String host;
private int port;
public Builder host(String h) {
this.host = h;
return this;
}
public Config build() {
return new Config(this);
}
}
private Config(Builder b) {
// 可直接访问外部类的 static 成员
System.out.println("Built with version: " + VERSION);
}
}
private 成员(反之亦然)static 字段或方法(除非传入实例引用)static 字段,需用 OuterClass.field 显式限定静态内部类编译后是独立的 class 文件,JVM 不认为它是“内部类”——isMemberClass() 返回 false,getEnclosingClass() 返回 null。但 isStatic() 为 true,且 getName() 包含 $ 符号。
Class.forName("pkg.Outer$StaticInner"),不能写成 Outer.StaticInner.class(编译期语法,运行时无效)Outer.StaticInner )在字节码中会被擦除,类型参数只存在于源码层面private,反射调用 getDeclaredConstructor().setAccessible(true) 才能实例化真正容易出错的地方在于混淆“静态内部类”和“匿名静态类”(比如 new SomeInterface() { ... } 写在 static 方法里),后者仍是非静态的——它没有名字,但依然隐式持有外部类实例引用(除非外部类是 static 上下文且无实例可持)。这种细节不看字节码几乎无法察觉。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...