java方法参数返回值问题

关于方法传入常量参数问题

测试代码

public class TestMain {
    
    

    public void changeNumber(int number){
    
    
        System.out.println("方法执行开始"+number);
        number=10;
        System.out.println("方法执行最终"+number);
    }

    //main函数程序的入口
    public static void main(String[] args) {
    
    
        //创建一个对象(在内存中会提前加载类模板,加载当前类)
        TestMain testMain = new TestMain();//new 会在堆内存中开辟一个空间
        int n=1;
        //调用方法
        //1.方法存在哪里?     存在堆内存的对象空间内
        //2.方法的执行?      在栈内存中开辟一块临时的方法执行空间
        testMain.changeNumber(1);//需要传入一个int 参数
        System.out.println("方法执行完毕,main方法中的n的值为"+n);
    }
}

执行结果为

方法执行开始1
方法执行最终10
方法执行完毕,main方法中的n的值为1

通过内存图描述以上过程

在这里插入图片描述
通过以上过程可以知道,方法执行完毕后,临时在栈内存开辟空间会销毁,要想将方法中的数据结果得到,需要将数据返回

修改测试代码

public class TestMain {
    
    

    public int changeNumber(int number){
    
    
        System.out.println("方法执行开始"+number);
        number=10;
        System.out.println("方法执行最终"+number);
        return number;
    }

    //main函数程序的入口
    public static void main(String[] args) {
    
    
        //创建一个对象(在内存中会提前加载类模板,加载当前类)
        TestMain testMain = new TestMain();//new 会在堆内存中开辟一个空间
        int n=1;
        //调用方法
        //1.方法存在哪里?     存在堆内存的对象空间内
        //2.方法的执行?      在栈内存中开辟一块临时的方法执行空间
        n = testMain.changeNumber(1);//需要传入一个int 参数
        System.out.println("方法执行完毕,main方法中的n的值为"+n);
    }
}

运行结果

方法执行开始1
方法执行最终10
方法执行完毕,main方法中的n的值为10

通过内存图描述以上过程

在这里插入图片描述

总结形参和实参

  • 形参可以理解为是方法执行时的临时变量空间
  • 实参可以理解为是方法调用时传递进去的参数
  • 方法调用时会将实参内容传递给形参
  • 如果传递内容是基本类型,则传递的是值,形参改变,实参不变
  • 如果传递的内容是引用类型,则传递的是引用,形参改变,实参跟着改变

方法传入数组类型问题

测试代码

public class TestMain {
    
    

        public void changeArray(int[] array){
    
    
            System.out.println("方法执行开始"+array[0]);
            array[0]=10;
            System.out.println("方法执行结束"+array[0]);
        }

    //main函数程序的入口
    public static void main(String[] args) {
    
    
        TestMain testMain = new TestMain();
        int[] array=new int[]{
    
    1,2,3};
        testMain.changeArray(array);
        System.out.println("方法执行完毕,main中的数组的第一个值为:"+array[0]);
    }
}

测试结果

方法执行开始1
方法执行结束10
方法执行完毕,main中的数组的第一个值为:10

通过内存图描述以上过程

在这里插入图片描述

扫描二维码关注公众号,回复: 12392557 查看本文章

方法传入数组值交换的问题

测试代码

public class TestMain {
    
    
    //将两个数组内的元素对应位置交换
    public void changeArray(int[] array1, int[] array2) {
    
    
        for (int i = 0; i < array1.length; i++) {
    
    
            //每一次找到一个数组中的元素跟另一个数组对应位置
            int temp=array1[i];
            array1[i]=array2[i];
            array2[i]=temp;
        }
    }
    //main函数程序的入口
    public static void main(String[] args) {
    
    
        //隐藏加载类模板过程
        //创建对象
        TestMain testMain = new TestMain();
        //创建两个数组
        int[] array1=new int[]{
    
    1,2,3,4};
        int[] array2=new int[]{
    
    5,6,7,8};
        //调用方法交换数组元素
        testMain.changeArray(array1,array2);
        //通过工具类打印数组结果
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
}

测试结果
[5, 6, 7, 8]
[1, 2, 3, 4]

由于数组引用指向的堆内存空间没变,数组内储存的值已经发生改变,所以结果发生改变

通过内存图描述以上过程

在这里插入图片描述

方法中数组引用地址交换问题

测试代码

public class TestMain {
    
    
    //将两个数组内的引用交换,用临时变量来接收
    public int[][] changeArray(int[] array1, int[] array2) {
    
    
        int[] temp=array1;
        array1=array2;
        array2=temp;
        int[][] result={
    
    array1,array2};
        return result;
    }
    //main函数程序的入口
    public static void main(String[] args) {
    
    
        //隐藏加载类模板过程
        //创建对象
        TestMain testMain = new TestMain();
        //创建两个数组
        int[] array1=new int[]{
    
    1,2,3,4};
        int[] array2=new int[]{
    
    5,6,7,8};
        //调用方法交换数组引用,接收返回结果
        int[][] ints = testMain.changeArray(array1, array2);
       //将交换完毕的数组引用赋值给原数组
        array1=ints[0];
        array2=ints[1];
        //通过工具类打印数组结果
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
    }
}

测试结果
[5, 6, 7, 8]
[1, 2, 3, 4]

由于在方法执行时交换数组引用,方法执行完毕时,临时执行方法的空间会被销毁,方法前传入的数组引用未被改变,要想让数组的引用交换成功,就必须存储交换完后的数组引用返回出去,再重新赋值给两个数组

通过内存图描述以上过程

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45608165/article/details/112128721