函数中参数传值
函数中参数传值
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具有相同特性。再推广至包装类型,所有包装类型均具有此特性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术