嵌套类解析及代码疑问:为何一值重置初始值另一值持续累加?
搞懂Java嵌套类中成员变量的累加问题
首先我先把你没写完的代码补全并修正笔误(看起来你可能把内部类的构造函数名写错了,Brenda应该是继承In的子类),再加上测试场景,这样更容易解释问题:
public class Out { // 外部类的成员变量 private int value = 1; public In initBrenda(String emri) { return new Brenda(emri); } // 非静态内部类In protected class In { // 内部类自己的成员变量 private int value = 10; private String name; // 修正:In类的构造函数 public In(String name) { this.name = name; } public void printIn() { System.out.println(name + ": value= " + value++); } // 新增:访问外部类的value的方法 public void printOutValue() { // 用Out.this区分外部类的value,避免和内部类的value重名 System.out.println("Out's value: " + Out.this.value++); } } // 继承In的嵌套子类Brenda private class Brenda extends In { public Brenda(String name) { super(name); } } // 测试代码 public static void main(String[] args) { Out outObj = new Out(); In brenda1 = outObj.initBrenda("Brenda1"); brenda1.printIn(); // 输出:Brenda1: value= 10 brenda1.printIn(); // 输出:Brenda1: value= 11 In brenda2 = outObj.initBrenda("Brenda2"); brenda2.printIn(); // 输出:Brenda2: value= 10 brenda1.printOutValue(); // 输出:Out's value: 1 brenda2.printOutValue(); // 输出:Out's value: 2 } }
接下来解释你困惑的核心问题:为什么有的value会回到初始值,有的能持续累加?
1. 内部类自己的value(In类里的private int value = 10):每次新建实例都会重置
In是非静态内部类,它的每个实例都独立拥有自己的成员变量副本。当你调用initBrenda创建新的Brenda(也就是In的子类实例)时,每个新实例都会重新初始化自己的value为10:
- 第一次调用
brenda1.printIn(),它的value从10变成11;第二次调用同一个实例的方法,value会在上一次的基础上继续累加。 - 但新建的
brenda2是一个完全独立的内部类实例,它的value是全新的,初始值还是10,所以第一次调用会输出10——这就是你看到的“回到初始值”的情况。
2. 外部类的value(Out类里的private int value = 1):同一个外部实例下会持续累加
外部类的成员变量属于外部类的实例(这里是outObj),所有绑定到同一个外部实例的内部类实例,访问的都是同一个value变量。
- 不管你用
brenda1还是brenda2调用printOutValue(),因为它们都属于outObj这个外部实例,所以每次访问的都是同一个value,会在上一次的基础上累加,不会重置。
关键注意点
如果内部类和外部类有同名变量,一定要用外部类名.this.变量名来明确访问外部类的变量,否则会默认访问内部类自己的变量(这是Java的作用域规则)。
内容的提问来源于stack exchange,提问作者user8930032
相关产品推荐
相关产品推荐

