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!