java对象数组只能在所定义的类方法扩容,却不能被其他类方法来扩容,请问为何?

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;//指向内存地址改变
结果如图:

img

应该是因对让扩容方法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;//数组已初始化的个数
}
 
 

img

java方法传递进来一个地址,但是你将这个变量a指向了另外一个地址,而不是将a的地址再次指向新的地址

你函数中是将 a 作为实参输入,然后在函数中令a=newa,但这无法达到你要的结果。应该将 &a 作为实参传入函数。
也就是 a作为实参传的是a的值,并非地址。所以应该用 &a 作为实参,才是地址,然后你才能在函数中改变并更新