按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。java中只有值传递。
二、示例 例1:public static void main(String[] args) {
int m = 10;
int n = 20;
swap(m,n);
System.out.println("m="+m);
System.out.println("n="+n);
}
public static void swap(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println("a="+a);
System.out.println("b="+b);
}
执行结果:
在 swap 方法中,a、b 的值进行交换,并不会影响到 num1、num2。因为,a、b 中的值,只是从 num1、num2 的复制过来的。当swap方法执行完后出栈,a和b会一起出栈。
例2:
package LX;
public class TestDemo {
private String name;
private int age;
public TestDemo(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public static void change(TestDemo s1, TestDemo s2){
TestDemo temp = new TestDemo("张三",18);
s1 = s2;
s2 = temp;
System.out.println(s1.toString());
System.out.println(s2.toString());
}
public static void main(String[] args) {
TestDemo t1 = new TestDemo("张三", 18);
TestDemo t2 = new TestDemo("李四", 20);
TestDemo.change(t1, t2);
System.out.print(t1.toString());
System.out.print(t2.toString());
}
}
执行结果:
change方法中拷贝的t1和t2的地址,方法结束出栈,s1和s2也会消失,所以t1和t2并不受影响
例3:package LX;
public class TestDemo {
private String name;
private int age;
public TestDemo(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public static void change(TestDemo s1, TestDemo s2){
TestDemo temp = new TestDemo("王五",20);
temp.name = s1.name;
s1.name = s2.name;
s2.name = temp.name;
}
public static void main(String[] args) {
TestDemo t1 = new TestDemo("张三", 18);
TestDemo t2 = new TestDemo("李四", 20);
TestDemo.change(t1, t2);
System.out.print(t1.toString());
System.out.print(t2.toString());
}
}
执行结果:
改变对象的属性并不难,这一次我们也是拷贝的是一个副本,拷贝的是TestDemo对象的副本,拷贝过来的对象和原对象指向同一内存的存储空间,所以当(t1,t2-- 拷贝)改变值的时候原person也改变值。
我们知道其实在栈内存当中原t1,t2里面存贮着堆内存当中的Person类的内存地址,而java在这里传输的是原t1,t2的存贮着的地址值



