Java中值传递和引用传递原理以及区别

Java在参数传递时有两种:一种是按值传递,一种是按引用传递

值传递:值传递是指在调用方法时将实际参数复制一份传递到方法中,也就是说,在调用方法时,实际参数把他的值的副本传递给对应的形式参数。(注意这里说的是值)更简单来说,就是直接复制了一份数据过去,此时,内存中应该是存在两个相等的基本类型,后面方法中的操作都是对这个形参(副本)进行修改,不会影响到实际参数的值,但是值传递也有缺点:因为是直接复制,所以这种方式在传递数据量非常大的时候,运行效率自然就会降低,所以Java在传递数据量很小的数据的时候是值传递,比如Java中的各种基本类型:float,double,int等类型。

引用传递:引用传递就弥补了上面的不足,在调用方法时,实际参数的引用(地址,而不是参数的值)被传递给相应的形式参数,也就是说引用传递时,操作的都是源数据,在方法执行中,形参和实参内容相同,指的是同一块地址值,方法执行中对引用的操作将会影响到实际对象  比如Object  List 二维数组 Map等除了基本类型的都是引用传递

//值传递举例

public class ValuePass {
	public static void main(String[] args) {
		ValuePass valuePass = new ValuePass();
		int param=20;
		valuePass.setParam(param);
		System.out.println("值传递参数"+param);
	}
	public void setParam(int a) {
		a=a+10;
		System.out.println("值传递参数"+a);		
	}
	public void setValue(IntValue source) {
		source.setValue(40);
		System.out.println("赋值"+source.getValue());
	}
	
}
class IntValue{
	public int value;
	
	public IntValue(int source) {
		value=source;
	}

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
	
}

运行结果:
值传递参数30
值传递参数20
//引用传递举例:
public class ValuePass {
	public static void main(String[] args) {

		User user = new User("小橘子",18,"女");
		
		System.out.println("引用传递前"+"==========="+user.getName()+user.getAge()+user.getSex());
		
		setValue(user);
		
		System.out.println("引用传递后"+"==========="+user.getName()+user.getAge()+user.getSex());
			
		
	} 
	public static void setValue(User user) {

		user.setName("大西瓜");
		user.setAge(80);
		user.setSex("男");
		
		System.out.println("赋值"+"==========="+user.getName()+user.getAge()+user.getSex());
	}
	
}
class User{
	public String name1;
	public int age1;
	public String sex1;
	

	public User(String name,int age,String sex) {
		name1=name;
		age1=age;
		sex1=sex;
		
	}
	public String getName() {
		return name1;
	}
	public void setName(String name) {
		this.name1 = name;
	}
	public int getAge() {
		return age1;
	}
	public void setAge(int age) {
		this.age1 = age;
	}
	public String getSex() {
		return sex1;
	}
	public void setSex(String sex) {
		this.sex1 = sex;
	}	
}

运行结果:
引用传递前===========小橘子18女
赋值===========大西瓜80男
引用传递后===========大西瓜80男
May everyone be happy every day and everything go well!

猜你喜欢

转载自blog.csdn.net/jing_80/article/details/80915193