前言
想必很多人在学习java之前就已经学习过c语言了吧,里面就值传递和址传递,在java中是否也存在类似的特性呢?下面通过几个例子来进行说明
基本数据类型的传递
public void changeValue(int num) {
num = 0;
}
@Test
public void t1() {
int num = 1;
System.out.println("调用方法前:" + num);
changeValue(num);
System.out.println("调用方法后:" + num);
}
大家看上面的代码,结果会输出上面?输出结果如下
调用方法前:1
调用方法后:1
通过输出结果就可以发现changeValue里面改变num的值其实并没有作用,也就可以说明对于基本数据类型来说,方法参数传递采用的是值传递
引用类型传递
class Cat {
public String name;
public Cat(String name) {
this.name = name;
}
}
public void changeCatName(Cat cat) {
cat.name = "汤姆";
}
@Test
public void t2() {
Cat cat = new Cat("tom");
System.out.println("修改前的名称:" + cat.name);
changeCatName(cat);
System.out.println("修改后的名称:" + cat.name);
}
大家看一下上面代码会输出什么,Cat的name会发生变化吗?输出结果如下
修改前的名称:tom
修改后的名称:汤姆
可以发现,changeCatName成功修改了Cat的name,这也就可以说明在java中,引用类型的参数传递是址传递
引入传递 OR 值传递
上面我们发现了参数传递可以修改对象的值,但是传递的是地址还是引用想必大家还是有疑问,下面我们先来看一段代码
public void swapCat(Cat cat1, Cat cat2) {
Cat temp = cat1;
cat1 = cat2;
cat2 = temp;
}
@Test
public void t3() {
Cat cat1 = new Cat("小花");
Cat cat2 = new Cat("小黑");
System.out.println("交换前的cat1的名称:"+cat1.name+" hashcode:"+cat1.hashCode());
System.out.println("交换前的cat2的名称:"+cat2.name+" hashcode:"+cat2.hashCode());
swapCat(cat1, cat2);
System.out.println("\n交换后的cat1的名称:"+cat1.name+" hashcode:"+cat1.hashCode());
System.out.println("交换后的cat2的名称:"+cat2.name+" hashcode:"+cat2.hashCode());
}
大家可以思考一下,swapCat是不是真的会交换cat1和cat2呢?输出结果如下
交换前的cat1的名称:小花 hashcode:1291113768
交换前的cat2的名称:小黑 hashcode:2005167404
交换后的cat1的名称:小花 hashcode:1291113768
交换后的cat2的名称:小黑 hashcode:2005167404
可以发现,我们在swapCat中明明交换了2个Cat的地址,但是却并没有对cat1和cat2造成影响,这也就说明了引用类型进行参数传递,传递的是地址的值,相当于是一个副本,并不是该对象的引用。
总结
- 方法不能修改基本数据类型的参数
- 方法可以改变对象的参数
- 方法不能让一个对象参数引用到一个新的对象
大家需要记住的是java不存在指针,不能够进行引用传递,参数传递都是值传递,基本类型参数就是传递当前值,对象就是传递地址