实际上,java方法参数传递只有值传递,只不过我们所说的引用传递 传递的是 对象的引用(地址值)
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递 | 引用传递 | |
---|---|---|
根本区别 | 拷贝值 | 拷贝对象(对象引用改变,但指向的是同一对象) |
所以 | 方法中无法改变原来的对象 | 方法中可以改变原来的对象(对象的属性…) |
对象的属性(普通成员变量):不包含静态成员变量(这个是属于类的),不包含常量(final修饰,因为不是变量,不可改变)
值传递(参数是基本类型)
public static void main(String[] args) {
int a = 1, b = 2;
System.out.println(a+" "+b);
swap(a,b);
System.out.println(a+" "+b);
}
// 参数是基本类型
public static void swap(int a, int b) {
int tmp = 0;
tmp = a;
a = b;
b = tmp;
}
/*
1 2
1 2
*/
引用传递(参数是引用类型):类、数组
- 引用类型 两值交换 也只能是
内部元素或变量进行交换
,不是对象进行交换(这个是错误的,相当于赋值操作)
public class Arg {
public static void main(String[] args) {
Data data = new Arg().new Data();
data.a = 1;
data.b = 2;
System.out.println(data.a+" "+data.b);
swap(data);
System.out.println(data.a+" "+data.b);
}
// 参数是引用类型
public static void swap(Data data) {
int tmp = 0;
tmp = data.a;
data.a = data.b;
data.b = tmp;
}
class Data{
int a,b;
}
}
/*
1 2
2 1
*/
public static void main(String[] args) {
String[] strs = new String[2];
strs[0] = "1";
strs[1] = "2";
System.out.println(strs[0]+" "+strs[1]);
swap(strs);
System.out.println(strs[0]+" "+strs[1]);
}
public static void swap(String[] str) {
String tmp = "";
tmp = str[0];
str[0] = str[1];
str[1] = tmp;
}
/*
1 2
2 1
*/
两值交换 引用传递错误示例
错误示例1
public static void main(String[] args) {
String a = "1";
String b = "2";
System.out.println(a+" "+b);
swap(a,b);
System.out.println(a+" "+b);
}
public static void swap(String a, String b) {
String tmp = "";
tmp = a;
a = b;
b = tmp;
}
/*
1 2
1 2
*/
错误示例2
传入的是String类型 引用类型,但仍然不是内部元素或属性的值交换
public static void main(String[] args) {
String[] strs = new String[2];
strs[0] = "1";
strs[1] = "2";
System.out.println(strs[0]+" "+strs[1]);
swap(strs[0],strs[1]);
System.out.println(strs[0]+" "+strs[1]);
}
public static void swap(String a, String b) {
String tmp = "";
tmp = a;
a = b;
b = tmp;
}
/*
1 2
1 2
*/