ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

函数中参数传值

2022-06-15 17:00:19  阅读:158  来源: 互联网

标签:函数 数据类型 hashcode 参数 println 传值 String


函数中参数传值

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具有相同特性。再推广至包装类型,所有包装类型均具有此特性。

标签:函数,数据类型,hashcode,参数,println,传值,String
来源: https://www.cnblogs.com/lovekey/p/15862533.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有