区分值传递和引用传递的关键在于实参是否被函数所修改
public class Test2 {
public static void main(String[] args) {
int age = 10;
String name = "张三";
User user = new User(name, age);
change(age,name);
change(user);
System.out.println("年龄:"+age+" == 姓名:"+name);
//输出结果:年龄:10 == 姓名:张三
System.out.println(user);
//输出结果:User [name=李四, age=20]
}
public static void change(int age,String name) {
age = 20;
name="李四";
}
public static void change(User user) {
user.setAge(20);
user.setName("李四");
//注意,此处我要改变参数的内存地址,但是没有成功,可以证明,此处参数是内存地址的拷贝
//我将传入对象的内存地址改变,没有影响到函数外实参
user = new User();
}
}
class User{
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}可以看到调用change方法去改变 int age 和 String name ,实参没有受到影响
当age和name作为user对象的属性,输出user时,属性已经发生了变化,函数改变了实参
原理:
int 类型被传入函数时,是将原值拷贝,作为参数输入
User对象是将地址拷贝,作为参数传入,所以内存地址中的值发生变化,函数外的user也被改变,但是当我把参数的内存地址改变,函数外没有发生任何变化
String拷贝的也是地址,只是String的底层是final修饰,无法改变地址
感谢大佬:blog.csdn.net/u014745069/…