Java值传递和引用传递

198 阅读1分钟

区分值传递和引用传递的关键在于实参是否被函数所修改

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/…