1.什么是值传递?
值传递:方法调用时,会创建副本,传递的是值的副本。也就是说传递后就不相关了。
代码示例:
public static void main(String[] args) {
int i = 666;
System.out.println("调用changeInt方法前main方法中的i:"+i); // 666
changeInt(i);
System.out.println("调用changeInt方法后main方法中的i:"+i); // 666
}
public static void changeInt(int i) {
// 这里我们改变i的值并不会对原来的i造成影响
i = 888;
System.out.println("changeInt方法中的i:"+i); // 888
}
2.什么是引用传递?
引用:引用可以理解为对象的别名,也可以理解为指向。这个概念很重要
Student student; // 声明一个指向null的引用
student = new Student(); // 引用指向一个学生对象
引用传递:方法调用时,不会创建副本,传递的是引用。也就是说传递后对形参进行重新赋值会改变引用的指向。
形象举例:
引用传递:你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。
值传递:你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对新钥匙做什么都不会影响你手里的钥匙。
3.Java中对象做参数传递时产生的引用传递的错觉
错觉原因:
不管是值传递还是引用传递,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了,你都会受到影响。
Java对象做参数传递时,传递的是地址值的拷贝,这个时候形参和实参的都指向了同一个对象,对对象的属性进行操作当然会有影响。
错觉代码:
public static void main(String[] args) {
Student student = new Student(12, "猪");
System.out.println(student); // Student(age=12, name=猪)
changeStudent(student);
System.out.println(student); // Student(age=21, name=大白菜)
}
public static void changeStudent(Student student) {
student.setAge(21);
student.setName("大白菜");
System.out.println(student); // Student(age=21, name=大白菜)
}
验证对象做参数传递是值传递的正确代码:
public static void main(String[] args) {
Student student = new Student(12, "猪");
System.out.println(student); // Student(age=12, name=猪)
changeStudent(student);
System.out.println(student); // Student(age=12, name=猪)
}
public static void changeStudent(Student student) {
// 这个地方如果传递的是引用(即指向猪学生的student),那改变他的指向应该会影响到原来的引用student,但是并没有
student = new Student(21, "大白菜");
System.out.println(student); // Student(age=21, name=大白菜)
}
4.Java中值传递的现象
- 基本类型参数,方法体内对参数进行重新赋值或者运算,不会改变原有变量的值。
- 引用类型参数,方法体内对参数进行重新实例化,不会改变原引用的指向
- 引用类型参数,方法体内对参数的属性进行操作,会改变原引用指向对象的属性值
5.结论
Java中的参数传递都是值传递
基本数据类型传递的是值的拷贝
引用数据类型传递的是地址值的拷贝(引用所指向对象的地址值)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。