请求解释Java数组中对象相关的Mix4示例代码
我来帮你把这段Java代码拆解开,一步步捋清楚就好懂啦~
首先先把完整的代码补全(原代码里的maybeNew方法被截断了,这类练习题里它的实现通常是这样的):
public class Mix4 { int counter = 0; public static void main(String[] args) { int count = 0; Mix4[] m4a = new Mix4[20]; int x = 0; while(x<19) { m4a[x] = new Mix4(); m4a[x].counter = m4a[x].counter+1; count = count+1; count = count+m4a[x].maybeNew(x); x = x+1; } System.out.println(count+" "+m4a[1].counter); } // 常见的maybeNew方法实现 int maybeNew(int x) { if(x%2 == 0) { this.counter++; return 1; } else { Mix4 m = new Mix4(); m.counter++; return 2; } } }
接下来我们分模块拆解:
核心概念先理清
- 成员变量
counter:属于Mix4类的实例对象,每个Mix4对象都有自己独立的counter值,不是所有对象共享同一个。 - 数组
m4a:这是一个能装20个Mix4对象引用的数组,刚创建时数组里全是null(没有实际对象),只有循环里执行new Mix4()后,才会把真实的对象放进数组对应位置。
main方法执行流程拆解
初始化环节
int count = 0;:定义一个局部变量count,用来统计后续累加的数值,初始为0。Mix4[] m4a = new Mix4[20];:创建长度为20的数组容器,此时数组里20个位置都是空的,没有Mix4对象。int x = 0;:循环计数器,用来控制循环次数,初始为0。
while循环(共执行19次,x从0到18)
每次循环按顺序做这些事:
- 创建对象并放入数组:
m4a[x] = new Mix4();
每次执行new Mix4()都会生成一个全新的Mix4实例,这个实例的counter默认是0(Java中int类型成员变量默认初始化值为0)。 - 当前数组对象的counter自增:
m4a[x].counter = m4a[x].counter+1;
刚创建的对象counter是0,执行完这行就变成1了。 - count加1:
count = count+1;
19次循环下来,这部分给count贡献了19。 - 调用maybeNew并累加返回值:
count = count+m4a[x].maybeNew(x);
这是最容易懵的地方,我们看maybeNew的逻辑:- 如果x是偶数(比如x=0、2、4...18):
对当前数组里的m4a[x]对象的counter再次自增(从1变成2),然后返回1,所以count再加1。 - 如果x是奇数(比如x=1、3...17):
新建一个和数组无关的临时Mix4对象,把这个临时对象的counter从0改成1,然后返回2,所以count再加2。
划重点:奇数时创建的临时对象不会放进数组,用完就会被回收,完全不影响数组里的元素!
- 如果x是偶数(比如x=0、2、4...18):
- x自增1:
x = x+1;,准备下一次循环。
循环结束后的输出
System.out.println(count+" "+m4a[1].counter);
- 计算count的总值:19(基础累加) + 10次偶数循环的1(共10) + 9次奇数循环的2(共18)= 19+10+18=47。
m4a[1]是x=1时创建的对象,它的counter在步骤2变成1,而x=1是奇数,maybeNew里没有修改它的counter(而是改了临时对象的),所以它的counter值还是1。
容易踩坑的点
- 别把成员变量
counter和局部变量count搞混:一个是每个对象独有的,一个是main方法里唯一的。 - 数组里的每个
Mix4对象都是独立的,修改其中一个的counter不会影响其他的。 - 奇数x时
maybeNew创建的对象和数组无关,不会改变数组元素的状态。
内容的提问来源于stack exchange,提问作者user4884539
相关产品推荐
相关产品推荐

