值传递
值传递,是指方法调用时,传递的参数是按值的拷贝传递。
如:
public class ValueTest {
public void test(int x){
System.out.println("值传递,x:"+x);
}
public static void main(String[] args) {
int x = 1;
new ValueTest().test(x);
}
}
引用传递
引用传递,是指方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
如:
public class ReferenceTest {
public void test(Rf rf) {
System.out.println("引用传递,rf:" + rf);
}
public static void main(String[] args) {
Rf rf = new Rf(1, "张三");
new ReferenceTest().test(rf);
}
}
class Rf {
private int id;
private String name;
public Rf() {
}
public Rf(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "id:" + id + ",name:" + name;
}
}
区别?
值传递后,改变传递参数,由于是拷贝一份,参数不会改变
引用传递后,改变传递参数,引用是同一个对象,参数会改变
例子:
public class ReferenceAndValueTest {
public void test1(int x) {
System.out.println("获取到,x:" + x);
x++;
System.out.println("改变为,x:" + x);
}
public void test2(String str) {
System.out.println("获取到,str:" + str);
str = "李四";
System.out.println("改变为,str:" + str);
}
public void test3(Rf rf) {
System.out.println("获取到,rf:" + rf);
rf.setName("李四");
System.out.println("改变为,rf:" + rf);
}
public static void main(String[] args) {
ReferenceAndValueTest vat = new ReferenceAndValueTest();
int x = 1;
System.out.println("调用前,x;" + x);
vat.test1(x);
System.out.println("调用后,x;" + x);
String str = "张三";
System.out.println("调用前,str;" + str);
vat.test2(str);
System.out.println("调用后,str;" + str);
Rf rf = new Rf(1, "张三");
System.out.println("调用前,rf:" + rf);
vat.test3(rf);
System.out.println("调用后,rf:" + rf);
}
}
class Rf {
private int id;
private String name;
public Rf() {
}
public Rf(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "id:" + id + ",name:" + name;
}
}
执行结果:
调用前,x;1
获取到,x:1
改变为,x:2
调用后,x;1
调用前,str;张三
获取到,str:张三
改变为,str:李四
调用后,str;张三
调用前,rf:id:1,name:张三
获取到,rf:id:1,name:张三
改变为,rf:id:1,name:李四
调用后,rf:id:1,name:李四
解释:
通过执行结果:(int)x 是值传递,(String)str 是值传递,(Rf对象)rf 是引用传递
总结
Java中基本数据类型是以值传递的方式进行传参;
对象类型是以引用传递的方式进行传参;
String类型不属于基本数据类型,但是以值传递的方式进行传参;