前言
网上好多关于java参数传递的解释,有的说是值传递
,也有说是引用传递
,还有说都有的。我今天就另辟蹊径谈谈我自己的看法。不管它是值传递
还是引用传递
,我们应该关注传递过来的参数是怎么被我们使用的。
往下看
1、先用基本类型做一个实验:
@Test
public void test1() {
int i = 5;
System.out.println("改变前i的值" + i);
changeInt(i);
System.out.println("改变后i的值" + i);
}
public void changeInt(int nextI) {
nextI = 10;
}
输出结果:
改变前i的值5
改变后i的值5
改变前后的结果并没有变化。我们看changeInt(int nextI)
这个方法中的参数,前面类型int,其实jvm内部帮我们做了一个暗箱操作:
// 也就说在栈内存中定义了另一个int类型的变量nextI并把i的值赋给它
int nextI = i;
我们将代码修改一下:
@Test
public void test1() {
int i = 5;
System.out.println("改变前i的值" + i);
int nextI = i;
nextI = 10;
System.out.println("改变后i的值" + i);
}
这段代码相信大家一眼就看明白了,可是为什么传递到方法里就懵了呢。我们继续看下面的例子。
2、再用String类型做一个实验
@Test
public void test2() {
String a = "hello";
System.out.println("改变前i的值" + a);
changeString(a);
System.out.println("改变后i的值" + a);
}
public void changeString(String str) {
System.out.println("传递的str长度为" + str.length());
str = "123";
System.out.println("改变后的str长度为" + str.length());
}
输出结果:
改变前i的值hello
传递的str长度为5
改变后的str长度为3
改变后i的值hello
显然跟int的结果是一致的,相信到此你应该有所感悟了,那好我们继续改造下代码:
@Test
public void test2() {
String a = "hello";
System.out.println("改变前i的值" + a);
String str = a;
System.out.println("传递的str长度为" + str.length());
str = "123";
System.out.println("改变后的str长度为" + str.length());
System.out.println("改变后i的值" + a);
}
看,相当于我把抽取的方法又打散到了代码中,总之就是一句话:传递的参数会被赋值给方法括号中那个新的对象,还是不明白?那我接着往下看。
3、最后一个实验使用对象
@Test
public void test() {
People p = new People("zhangs", 30);
System.out.println("改变前的people" + p);
changePeople(p);
System.out.println("改变后的people" + p);
}
public void changePeople(People people) {
people.setAge(25);
}
输出结果:
改变前的peoplePeople{name=‘zhangs’, age=30}
改变后的peoplePeople{name=‘zhangs’, age=25}
这次我们成功的改变了people的属性值,怎么会这样呢?那我们再次改造代码:
@Test
public void test() {
People p = new People("zhangs", 30);
System.out.println("改变前的people" + p);
People p2 = p;
p2.setAge(25);
System.out.println("改变后的people" + p);
}
结果跟上面是一样的,这样看是不是通俗易懂,其实方法传递的时候就是帮我们做了一个赋值操作:People p2 = p;
。
我们拿people这个对象再做一个实验:
@Test
public void test() {
People p = new People("zhangs", 30);
System.out.println("改变前的people" + p);
changePeople(p);
System.out.println("改变后的people" + p);
}
public void changePeople(People people) {
people = new People("lsii", 15);
}
输出结果:
改变前的peoplePeople{name=‘zhangs’, age=30}
改变后的peoplePeople{name=‘zhangs’, age=30}
看到了吧。我们并没有改变这个对象哦。到此应该明白了吧。
最后再强调这句话:传递的参数会被赋值给方法括号中那个新的对象