java对象数组只能在所定义的类方法扩容,却不能被其他类方法来扩容,请问为何?
package expermenent;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Test test = new Test();//新建主类,为了引进主类中有一个方法
CapacityAndLength cl = new CapacityAndLength();//新建对象
Scanner scanner = new Scanner(System.in);//新建对象
cl.length=0;cl.capacity=3;//对象初始化
AAA[] a = new AAA[3];//新建对象数组
for(int i=0;i< a.length;i++){//对象数组初始化
a[i]=new AAA(0);
}
String choose;//选择是否继续扩容的变量
while(true){
test.expend(a,cl);//判断容量是否充足的方法,如果不足,则扩容
System.out.println("a.lenth="+a.length+" cl.length="+cl.length+" cl.capacity="+cl.capacity);
a[cl.length].setA(1);//给变量赋值
cl.length=cl.length+1;//长度要变化
choose=scanner.next();//输入选择
if(choose.equals("n")){
break;
}
}
//打印出来
for(int i=0;i< cl.length;i++){
System.out.println(a[i].getA());
}
}
public void expend(AAA[] a,CapacityAndLength cl){
if(cl.length==cl.capacity) {
System.out.println("正在扩容...");
AAA[] newa = new AAA[cl.capacity * 2];
for (int i = 0; i < newa.length; i++) {
newa[i]=new AAA(0);//对象数组初始化
}
for (int i = 0; i < a.length; i++) {
newa[i] = a[i];//对象数组拷贝
}
a=newa;//指向内存地址改变
cl.capacity=cl.capacity*2;
System.out.println("扩容成功!");
System.out.println("a.lenth="+a.length+" cl.length="+cl.length+" cl.capacity="+cl.capacity);
}
}
}
class AAA{
private int a;
public AAA(int a) {
this.a = a;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
class CapacityAndLength{
public int capacity;//数组容量,等效于a.length
public int length;//数组已初始化的个数
}
据我所了解,数组名等效于一个指针,
且我已执行a=newa;//指向内存地址改变
结果如图:
应该是因对让扩容方法expend()里的这种类型的形参赋值不能在main方法里生效,可以把引用变量a定义为Test类的成员变量,这样在expend()方法里对引用a的赋值则可以在main方法看到变化,然后因为main方法是静态方法,也需要把引用a定义为静态变量,修改如下:
package houseproject;
import java.util.Scanner;
public class Test {
static AAA[] a ;//新建对象数组,定义为Test类的成员变量
public static void main(String[] args) {
Test test = new Test();//新建主类,为了引进主类中有一个方法
CapacityAndLength cl = new CapacityAndLength();//新建对象
Scanner scanner = new Scanner(System.in);//新建对象
cl.length=0;cl.capacity=3;//对象初始化
a = new AAA[3];//新建对象数组
for(int i=0;i< a.length;i++){//对象数组初始化
a[i]=new AAA(0);
}
String choose;//选择是否继续扩容的变量
int index=0;
while(true){
test.expend(cl);//判断容量是否充足的方法,如果不足,则扩容
System.out.println("a.lenth="+a.length+" cl.length="+cl.length+" cl.capacity="+cl.capacity);
a[index++].setA(1);//给变量赋值
cl.length=cl.length+1;//长度要变化
choose=scanner.next();//输入选择
if(choose.equals("n")){
break;
}
}
//打印出来
for(int i=0;i< cl.length;i++){
System.out.print(a[i].getA()+" ");
}
}
public void expend(CapacityAndLength cl){
if((cl.length+1)==cl.capacity) {
System.out.println("正在扩容...");
AAA[] newa = new AAA[cl.capacity * 2];
for (int i = 0; i < newa.length; i++) {
newa[i]=new AAA(0);//对象数组初始化
}
for (int i = 0; i < a.length; i++) {
newa[i] = a[i];//对象数组拷贝
}
a=newa;//指向内存地址改变
cl.capacity=cl.capacity*2;
System.out.println("扩容成功!");
System.out.println("add,a.lenth="+a.length+" cl.length="+cl.length+" cl.capacity="+cl.capacity);
}
}
}
class AAA{
private int a;
public AAA(int a) {
this.a = a;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
class CapacityAndLength{
public int capacity;//数组容量,等效于a.length
public int length;//数组已初始化的个数
}
java方法传递进来一个地址,但是你将这个变量a指向了另外一个地址,而不是将a的地址再次指向新的地址
你函数中是将 a 作为实参输入,然后在函数中令a=newa,但这无法达到你要的结果。应该将 &a 作为实参传入函数。
也就是 a作为实参传的是a的值,并非地址。所以应该用 &a 作为实参,才是地址,然后你才能在函数中改变并更新