Java中如何仅修改对象数组中单个对象的成员变量?
问题分析与解决方法
问题根源
你的代码出现不符合预期的结果,有两个核心原因:
Nested类中的int a被定义为static:静态变量属于类本身,所有Nested实例共享同一个值,修改任意实例的a都会同步改变所有实例的a。- 所有
Nest对象共用同一个Nested实例:你只创建了一个Nested对象,然后把它赋值给数组中所有Nest的nested字段,导致所有Nest引用的是同一个Nested对象。
解决方案(保留数组)
要实现预期效果,需要做两处修改:
- 移除
Nested类中a的static修饰符,让a成为实例变量,每个Nested对象拥有独立的a值。 - 为数组中的每个
Nest对象创建独立的Nested实例,避免共用同一个对象。
修改后的代码
class Test{ public static class Nested{ int a; // 去掉static修饰符 Nested(int a){ this.a = a; } } public static class Nest{ Nested nested; Nest(Nested nested){ this.nested = nested; } } public static void main(String [] args){ Nest [] nest = new Nest[2]; // 为每个Nest创建独立的Nested实例 nest[0] = new Nest(new Nested(0)); nest[1] = new Nest(new Nested(0)); System.out.println(nest[0].nested.a + "\t" + nest[1].nested.a); nest[0].nested.a = 1; System.out.println(nest[0].nested.a + "\t" + nest[1].nested.a); } }
效果说明
修改后,每个Nest对象持有独立的Nested实例,a作为实例变量仅属于当前对象。此时修改nest[0].nested.a只会改变第一个对象的a值,输出将符合你的预期:
0 0 1 0
另外补充:你之前尝试的nest[0].nested = new Nested(1);在去掉static后也能生效——此时nest[0]会指向新的Nested实例(a=1),而nest[1]仍指向原来的实例(a=0),同样能得到预期结果,但更规范的做法是一开始就为每个Nest分配独立的Nested实例。
内容的提问来源于stack exchange,提问作者barium_sulfate
相关产品推荐
相关产品推荐

