在开始之前,我们先看看值传递和引用传递的定义:
值传递:
指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:
指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
看完定义我们再看看下面三个案例:
案例一:
public static void updateNum(int num) { num = 22; System.out.println("updateNum:" + num); } public static void main(String[] args) { int num = 11; updateNum(num); System.out.println("main:" + num); }
结果输出:
updateNum:22main:11
案例二: public static void updateUser(User user) { user.setName("爱看妹妹的凡老弟"); System.out.println("updateUser:" + user); } public static void main(String[] args) { User user = new User(); user.setName("凡老弟"); user.setAge(18); updateUser(user); System.out.println("main:" + user); }
结果输出:
updateUser:User{name='爱看妹妹的凡老弟', age=18}main:User{name='爱看妹妹的凡老弟', age=18}
案例三:
public static void updateName(String name) { name = "爱看妹妹凡老弟"; System.out.println("updateName:" + name); } public static void main(String[] args) { String name = "凡老弟"; updateName(name); System.out.println("main:" + name); }
结果输出:
updateName:爱看妹妹凡老弟main:凡老弟
看完案例是否有很多问好?下面一步步用Java内存模型来解析下案例:
案例一解析:
在案例一中 输出可以看出基本参数是值传递,uodateNum中num拷贝了main方法中的值;
案例二解析:案例二中的Java内存模型如上图,指向一个地址值,由此可见对象是引用传递。
案例三解析: 在分析案例三之前我们看下案例三中name 的 hashCode变化:输出:
updateName:21183711updateName:-464342267main:21183711
案例三中原本updateName中name指向凡老弟,又因为name = "爱看妹妹凡老弟"改变了地址引用。
总的来说,在此之前看了网上很多Java中值传递与引用传递的争论,有人说Java只有值传递,我只能说个人对值传递的理解不同罢了。 无论是值传递还是引用传递,其实都是一种求值策略。其本意考点还是对Java内存模型的理解。