zoukankan      html  css  js  c++  java
  • 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:

     

      
  • 相关阅读:
    全面分析C#方法中的ref和out
    SQL注入漏洞全接触入门篇
    如何使用四个语句来提高 SQL Server 的伸缩性
    5种提高SQL性能的方法
    SQL注入漏洞全接触高级篇
    网络游戏程序员须知 收包与发包
    SQL注入攻击的原理及其防范措施
    SQL注入漏洞全接触进阶篇
    C#委托的故事
    转眼又快一年了,最近没赚钱,在学习FLASH as3编程
  • 原文地址:https://www.cnblogs.com/xiongxx/p/6417541.html
Copyright © 2011-2022 走看看