【成员变量和局部变量类错误】
📅 2026/7/16 3:28:32
👁️ 阅读次数
📝 编程学习
项目场景:在Java中,将成员数组作为方法参数传递时,如果在方法内部对数组进行了“扩容(创建新数组)”并重新赋值,不能通过修改形参来更新成员变量。正确做法是直接操作成员变量本身.
问题描述:在定义一个方法并执行后,方法内的参数没有传到main中
例如:这段功能为扩增的代码中,在调用时,并没有实现扩增功能:
**public static void getNewArrays(String[] names,String[] states,String[] dts,String name){ //1.创建新数组 String[] newNames=new String[names.length*2]; String[] newstates=new String[states.length*2]; String[] newdts=new String[dts.length*2]; //2.把老数组元素复制给新数组: int i = 0; for ( ;i < names.length; i++) { newNames[i]=names[i]; newstates[i]=states[i]; newdts[i]=dts[i]; } //3.添加DVd到新数组里去 newNames[i]=name; newstates[i]="可借"; newdts[i]=""; System.out.println("新增<<" + name + ">>成功!"); //4. names=newNames; states=newstates; dts=newdts; } ---**原因分析:Java 只有值传递:当把数组(对象)作为参数传递时,传递的是“数组内存地址的副本”。
修改元素 vs 修改指向:
如果在方法内通过 names[i] = xxx 修改数组里的元素,外部成员变量是会跟着变的(因为大家指向同一块内存)。
但如果在方法内执行 names = newNames;,这只是让局部变量副本指向了新的内存地址,而外部的成员变量依然死死指着原来的旧地址。方法结束后,局部变量销毁,外部毫无影响。
解决方案:方法参数只传入需要新增的 name。在方法内部直接对类的成员变量 names, states, dts 进行扩容和重新赋值。
例如:直接使用成员变量,不用新设形参,方法体操作完,成员变量直接被成功替换。
public static void getNewArrays(String name){ //1.创建新数组 String[] newNames=new String[names.length*2]; String[] newstates=new String[states.length*2]; String[] newdts=new String[dts.length*2]; //2.把老数组元素复制给新数组: int i = 0; for ( ;i < names.length; i++) { newNames[i]=names[i]; newstates[i]=states[i]; newdts[i]=dts[i]; } //3.添加DVd到新数组里去 newNames[i]=name; newstates[i]="可借"; newdts[i]=""; System.out.println("新增<<" + name + ">>成功!"); //4. names=newNames; states=newstates; dts=newdts; }
编程学习
技术分享
实战经验