Java值传递
先上一个Java代码,试判断str0,str1,person前后的变化
public class Test {
public static void main(String[] args) {
String str0 = "str0";
String str1 = new String("str1");
Person person = new Person("person");
System.out.println("==========before===========");
System.out.println(str0.getClass().getName() + ":" + str0);
System.out.println(str1.getClass().getName() + ":" + str1);
System.out.println(person.getClass().getName() + ":" + person.getName());
func1(str0);
func1(str1);
func2(person);
System.out.println("==========after===========");
System.out.println(str0.getClass().getName() + ":" + str0);
System.out.println(str1.getClass().getName() + ":" + str1);
System.out.println(person.getClass().getName() + ":" + person.getName());
}
public static void func1(String str) {
str = "chg_str";
}
public static void func2(Person person) {
person.setName("chg_person");
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
运行后结果:
可以看到:str0,str1的值没有改变,person的name发生了改变。
下面进行分析:
进入函数前的草图:
在进入到函数之前,每个对象的引用指向其对象的内存的位置
进入函数作用域之后,函数为对象的引用创建了一个临时的复制。这是我们将str0、str1指向内存中的新创建的对象。
函数作用域结束后,临时引用消失,此时的str0所代表的仍是str0并未发生改变。整个函数过程中我们是对临时对象进行的操作。
总结:与其说Java的引用概念相对于C++中的引用,我觉得指针更为贴切。
但是这是针对其数据类型,而在其函数处理的传参过程中,其步骤都是先建立一个传入数据的复制,因此Java的传参方式始终是值传递