JavaSE面试题:方法的参数传递机制

/**
 * 方法的参数传递机制
 *
 * 实参给形参传值
 * 基本数据类型:传递的是数据值
 * 引用数据类型:传递的是地址值
 * (特殊的类型:String、包装类等对象不可变性)
 *
 */
public class Params {
    public static void main(String[] args) {
        //以下5个变量称之为局部变量
        //在方法栈中按照方法来分配空间,其中主方法一块空间,change()一块空间
        int i = 1;
        String str = "hello";//由于hello是字符串常量,存储在常量池中,所以方法栈中的str存储的是hello在常量池中的地址
        Integer num = 200;//Integer是包装类,在-128~127的范围中时是存储在常量池中的,因为num=200,所以存储在堆中,num存的是200在堆中的地址
        int[] arr = {1, 2, 3, 4, 5};//存储在堆中地址
        MyData my = new MyData();//存储在堆中地址

        change(i, str, num, arr, my);//实参列表

        System.out.println("i = " + i);
        System.out.println("str = " + str);
        System.out.println("num = " + num);
        System.out.println("arr = " + Arrays.toString(arr));
        System.out.println("my.a = " + my.a);
    }

    public static void change(int j, String s, Integer n, int[] a, MyData m) {//形参列表
        j += 1;//在传进来1的基础上+1等于 2
        s += "world";//在常量池中生成新的"helloworld",更新了地址,s此时存储的是新的地址
        n += 1;//同上,n此时存储的是堆中201的新地址
        a[0] += 1;//通过地址,修改了该地址中的值
        m.a += 1;//通过地址,修改了该地址中的值
    }

}
class MyData {
    int a = 10;
}

/**
 * 答案:
 *
 * i = 1
 * str = hello
 * num = 200
 * arr = [2, 2, 3, 4, 5]
 * my.a = 11
 */

你可能感兴趣的:(面试题,java,jvm)