数组和方法的相互操作 -- 引用传递

引用传递:

概念:多个栈内存共享一块儿堆内存地址(更形象一点可以理解为多个遥控器控制一台空调)

内存现阶段可以简单分为以下两部分:
栈内存: 方法中的局部变量,方法的形参,引用
堆内存: 存放数组内容、类对象内容(共享内存)

int[ ] data = new int[3];,data 称为数组的引用(保存在栈内存中),任何一个引用一定指向一块儿堆内存地址。只要看见关键字new,就一定在堆上分配空间。

数组作为引用数据类型,就一定可以发生引用传递。

//引用传递
int[] data = int[]{1, 3, 5};
int[] data1 = data;
① 先观察一下数组是如何开辟空间的:
public class ArrayDemo {
    public static void main(String[] args) {
        int[] x = new int[3];
        x[0] = 10;
        x[1] = 20;
        x[2] = 30;
        for(int i = 0; i < x.length; i++) {
            System.out.println(x[i]);
        }
    }
}

数组和方法的相互操作 -- 引用传递_第1张图片

② 多个栈内存指向相同的堆内存(引用传递)
public class ArrayDemo {
    public static void main(String[] args) {
        int[] x = new int[3];
        x[0] = 10;
        x[1] = 20;
        x[2] = 30;
        for(int i = 0; i < x.length; i++) {
            System.out.println(x[i]);
        }
        //引用传递
        int[] temp = x;
        //修改数据
        temp[0] = 55;
        System.out.println(x[0]);
    }
}

数组和方法的相互操作 -- 引用传递_第2张图片

1. 方法接收数组
public class FangFaJieShouShuZu {
    public static void main(String[] args) {
        int[] data = new int[]{1, 2, 3, 4, 5};
        printArray(data);  //相当于 int[] temp = data;
    }
    public static void printArray(int[] temp) {
        for(int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }
    }
}

数组和方法的相互操作 -- 引用传递_第3张图片

2. 方法返回数组
public class FangFaFanHuiShuZu {
    public static void main(String[] args) {
        int[] data = init();
        printArray(data);
    }
    //定义了一个返回数组的方法
    public static int[] init() {
        //匿名数组
        return new int[]{1, 2, 3, 4, 5};
    }
    public static void printArray(int[] temp) {
        for(int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }
    }
}

数组和方法的相互操作 -- 引用传递_第4张图片
现在的数组上发生了引用传递,那么就意味着方法在接收数组后也可以修改数组。

3. 方法修改数组
public class FangFaXiuGaiShuZu {
    public static void main(String[] args) {
        int[] data = init();
        bigger(data);
        printArray(data);
    }
    //定义了一个返回数组的方法
    public static int[] init() {
        return new int[]{1, 2, 3, 4, 5};
    }
    //把数组中的每个值扩大5倍
    public static void bigger(int[] arr) {
        for(int i = 0; i < arr.length; i++) {
            arr[i] *= 5;
        }
    }
    public static void printArray(int[] temp) {
        for(int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }
    }
}

数组和方法的相互操作 -- 引用传递_第5张图片

你可能感兴趣的:(Java)