• 函数中参数传值


    函数中参数传值

    1、基本数据类型传值

    当函数中传入的参数为基本数据类型时,函数中对传入参数的操作不会对函数外的数据产生影响。由于基本数据类型的变量名指向的是具体的数值,在函数内部,相当于将参数进行了拷贝,函数内只对拷贝后的参数进行操作。

    • 基本数据类型
    public class ParamsTrans {
    /**
    * 基本数据类型传值
    * @param a 基本数据类型
    */
    private static void primitiveType(int a){
    a = 1;
    }
    public static void main(String[] args) {
    int primitiveParam = 0;
    ParamsTrans.primitiveType(primitiveParam);
    System.out.println(primitiveParam);
    }
    }
    // 结果:0

    结果分析:基本数据类型primitiveParam初始值为0,在函数中对其值进行修改,输出值仍为0,说明函数内的操作未生效。

    • 基本数据类型数组
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    public class ParamsTrans {
    /**
    * 基本数据类型数组传值
    * @param d
    */
    private static void arrayType(int[] d){
    d[0] = 1;
    System.out.println("d hashcode:" + d.hashCode());
    }
    public static void main(String[] args) {
    int[] arrayParam = new int[2];
    arrayType(arrayParam);
    System.out.println(Arrays.toString(arrayParam));
    System.out.println("arrayParam hashcode:" + arrayParam.hashCode());
    }
    }
    // 结果:
    // d hashcode:460141958
    // [1, 0]
    // arrayParam hashcode:460141958

    结果分析:基本数据类型数组与基本数据类型在参数传值时,具有相同特性。

    2、引用数据类型传值

    当函数中传入的参数为引用数据类型时,函数中对传入参数的操作会对函数外的数据产生影响。由于引用变量指向对象的内存地址,在函数内部,参数只是创建了一个新的变量指向同一个对象,函数中对此对象进行操作,函数外的引用变量也会相应改变。

    import java.util.ArrayList;
    import java.util.List;
    public class ParamsTrans {
    /**
    * 引用数据类型传值
    * @param b 引用数据类型
    */
    private static void QuoteType(List<Integer> b){
    b.add(1);
    System.out.println("b hashcode:" + b.hashCode());
    }
    public static void main(String[] args) {
    List<Integer> quoteParam = new ArrayList<>();
    ParamsTrans.QuoteType(quoteParam);
    System.out.println(quoteParam.toString());
    System.out.println("quoteParam hashcode:" + quoteParam.hashCode());
    }
    }
    // 结果:
    // b hashcode:32
    // [1]
    // quoteParam hashcode:32

    结果分析:引用数据类型quoteParam初始值为空,在函数中添加元素,输出值为[1],说明函数内的操作已生效。由变量hash值可以看出,函数内与函数外为同一变量。

    3、包装数据类型传值

    在Java中,有一些对基本数据类型进行包装的类型,在参数传值时比较容易混淆,如:String、Integer、Double等。

    • String类型

      public class ParamsTrans {
      /**
      * Sting类型传值
      * @param c
      */
      private static void StringType(String c){
      c = "b";
      System.out.println("c hashcode:" + c.hashCode());
      }
      public static void main(String[] args) {
      String stringParam = "a";
      StringType(stringParam);
      System.out.println(stringParam);
      System.out.println("stringParam hashcode:" + stringParam.hashCode());
      }
      }
      // 结果:
      // c hashcode:98
      // a
      // stringParam hashcode:97

      结果分析:由代码执行结果可以看出,String类型虽然是引用变量,但是在函数中对其进行修改的操作并未生效,且函数内与函数外的变量也并不是同一个变量。这不符合上述引用数据类型的规律,由String类型源码可知,String中字符串实际是用char[]数组进行存储的,相当于是char[]的包装类。因此,在参数传递时,是对参数进行了拷贝。

    • Integer类型及包装类型

      根据上述对String类型的分析,查看Integer类源码,对Integer类进行赋值实际是对int类型进行操作。综上所述,在函数参数传值时,Integer与String具有相同特性。再推广至包装类型,所有包装类型均具有此特性。

  • 相关阅读:
    SQLAlchemy关联表删除策略设置
    论文课后总结
    基于Java+SpringBoot+Mybatis+Vue+ElementUi的校园闲置物品交易
    伟大的micropython smartconfig 配网它来了!!!
    SpringBoot-过滤器Filter+JWT令牌实现登录验证
    Python实现ABC人工蜂群优化算法优化支持向量机分类模型(SVC算法)项目实战
    XCIE-HUAWEI-双点双向引入带来的问题以及解决办法(三种)+各种路由环路
    聚类分析、matlab\我国各地区普通高等教育发展状况分析、Q型、R型聚类
    springboot配置多数据源
    【webrtc】接收/发送的rtp包、编解码的VCM包、CopyOnWriteBuffer
  • 原文地址:https://www.cnblogs.com/lovekey/p/15862533.html