首页 > 代码库 > java中引用传递和值传递的理解

java中引用传递和值传递的理解

按值调用(call by value):表示方法接收的是调用者提供的值

按引用调用(call by reference):表示方法接收的是调用者提供的地址

 

一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值

 

理解:

对于java来说,是不存在引用调用的,它总是按值调用

如何理解红字?方法是得到所有参数值的一个拷贝,方法无法修改传递给它的任何变量值的内容

示例1:

    public static void main(String[] args) {
        int temp = 0;
        int x = 10;
        int y = 11;
        System.out.println("before: " + x + " "+ y); // x = 10, y = 11
        temp = y;
        y = x;
        x = temp;
        System.out.println("after: " + x + " "+ y);  // x = 11, y = 10
    }

实例2:

    public static void main(String[] args) {
        int temp = 0;
        int x = 10;
        int y = 11;
        System.out.println("before: " + x + " "+ y); // x = 10, y = 11
        change(x, y);
        System.out.println("after: " + x + " "+ y);   // x = 10, y = 11 
    }
    public static void change(int x, int y) {
        int temp = 0;
        temp = y;
        y = x;
        x = temp;
    }

 

我们可以看到,一个方法不可以改变基本数据类型参数但是,却可以通过引用类型来改变参数:

示例:

public static void main(String[] args) {
        Test t1 = new Test("James", 15);
        
        plus(t1);
        
        System.out.println(t1.age); // 输出25
    }
    
    public static void plus(Test t){
        t.age += 10;
    }
}
class Test {
    String name;
    int age;
    
    public Test(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

 

 

 

最后,我们来试验一下引用类型是否可以对象交换:

示例:

public static void main(String[] args) {
        Test t1 = new Test("James", 15);
        Test t2 = new Test("Alice", 20);
        System.out.println(t1 + " " + t2); //t1 = test.Test@15db9742, t2 = test.Test@6d06d69c
        swap(t1, t2);
        System.out.println(t1 + " " + t2);  //t1 = test.Test@15db9742, t2 = test.Test@6d06d69c
    }
    
    public static void swap(Test t1, Test t2) {
        Test temp = t1;
        t2 = t1;
        t1 = temp;
    }
}
class Test {
    String name;
    int age;
    
    public Test(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    public Integer plus(Integer age){
        age += 10;
        return age;
    }

依旧是无法实现的

 

总结:

  • 一个方法不能修改基本数据类型的参数
  • 一个方法无法修改对象参数的状态
  • 对象参数可以通过对象引用来改变

java中引用传递和值传递的理解