• 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:

     

      
  • 相关阅读:
    使用Jmeter测试java请求
    如何高效开发jmeter自定义函数
    使用Fiddler进行抓包
    使用Jmeter导出导入接口自动化案例中的自定义变量
    使用Jmeter录制脚本并调试
    python练习——第3题
    python练习——第2题
    python练习——第1题
    python练习——第0题
    python机器学习——逻辑回归
  • 原文地址:https://www.cnblogs.com/xiongxx/p/6417541.html
Copyright © 2020-2023  润新知