Java传参都是传引用变量的副本

  最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值。

1 Java中的引用变量

  1.1 字面值引用变量:即基本数据类型的引用变量 ,如 int b = 1 , b就是字面值引用变量。
  多个字面值引用变量也可以指向同一字面值,其中一个引用修改字面值,不会影响另一个引用字面值。
 

 

  1.2 对象引用变量:即普通java对象的引用变量 ,如 String a = "abc" , Object b = new Object,a、b就是对象引用变量。
  Java 是不能直接操作对象的,只能通过“对象引用的操作”来操作对象。而对象的引用的表示就是对象变量。可以多个对象引用变量指向同一个对象。
  (1)对于普通对象
  其中一个引用修改对象值,也会影响另一个引用的对象值。如下图:
 

  而如果其中一个引用改变指向的值,另一个引用不改变。如下图:

 

  (2)对于String类或者包装类对象:
  String类和包装类如Interger、Character类对象的值,类似于基本数据类型的值,是存放在栈中的,不可改变的。
  比如String类的源码,其值value和其本省都是final的,一旦赋值就不可改变。

  故引用并不能修改对象值,如果其中一个引用“修改对象值”,它只是修改其指向的对象,另一个引用不改变。

2 实验验证

class Test {
    int intInObj;
    String strInObj;
    Integer integerInObj;

    public Test(int intInObj, String strInObj, Integer integerInObj){
        this.intInObj = intInObj;
        this.strInObj = strInObj;
        this.integerInObj = integerInObj;
    }
}

public class SendValue{
    public static void main(String[] args) {
        // 测试1:传int
        int testInt = 1;
        SendValue.change(testInt);
        System.out.println(testInt);

        // 测试2:传String
        String testString = "1";
        SendValue.change(testString);
        System.out.println(testString);

        // 测试3:传Integer
        Integer testInteger = 1;
        SendValue.change(testInteger);
        System.out.println(testInteger);

        // 测试4:传对象
        Test testObject = new Test(1, "1", 1);
        SendValue.change(testObject);   // 形参修改原对象内的值
        System.out.println(testObject.intInObj);
        System.out.println(testObject.strInObj);
        System.out.println(testObject.integerInObj);

        // 测试5:传对象
        SendValue.changeObject(testObject);     // 形参改变指向的对象
        System.out.println(testObject.intInObj);
        System.out.println(testObject.strInObj);
        System.out.println(testObject.integerInObj);
    }

    public static void change(int i) {
        i = 10;
    }

    public static void change(String str) {
        str = "10";
    }

    public static void change(Integer i) {
        i = 10;
    }

    public static void change(Test test) {
        test.intInObj = 10;
        test.strInObj = "10";
        test.integerInObj = 10;
    }

    public static void changeObject(Test test) {
        test = new Test(100, "100", 100);
    }
}

获得结果如下:

  画图解释测试4和测试5:

 

  
原文地址:https://www.cnblogs.com/xiongxx/p/6417541.html