java函数参数传参


java传参规则

(关于根据上下文自动识别的内容,有兴趣的人以后可以看看我们翻译的《java规则》)
  1、对象是按引用传递的
  2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
  3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
  4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
  
三句话总结一下:
  1.对象就是传引用

      2.原始类型就是传值

      3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。

### Java函数传参的细节 在 Java 编程语言中,所有的参数传递都是基于 **值传递** 的则。这意味着无论是基本数据类型还是引用数据类型的参数,在调用方法时都会将实际参数的一个副本传递给形式参数。 #### 基本数据类型的值传递 当向方法传递基本数据类型(如 `int`、`double` 等)作为参数时,会创建该变量的一份拷贝并将其传递给方法[^1]。因此,任何对这些参数值的修改都不会影响到始变量的值。 ```java public static void changePrimitive(int value){ value = 10; } public static void main(String[] args) { int num = 5; changePrimitive(num); System.out.println(num); // 输出仍然是 5 } ``` 上述代码展示了即使在方法内部改变了 `value` 变量的值,变量 `num` 并未受到影响[^2]。 #### 引用数据类型的值传递 对于引用数据类型(如数组、类实例等),情况稍微复杂一些。虽然 Java 使用的是值传递机制,但实际上被传递的是对象引用的副本。这使得方法可以访问和操作由该引用指向的实际对象的内容[^3]。 考虑下面的例子: ```java public static void testArray(int[] arrayRef){ arrayRef[0] = 99; // 修改第一个元素 } public static void main(String[] args) { int[] myArray = {1, 2, 3}; testArray(myArray); System.out.println(Arrays.toString(myArray)); // 输出 [99, 2, 3] } ``` 在这个例子中,尽管我们说这是值传递,但我们实际上是在传递一个指向相同数组的引用副本。因此,当我们更改此数组的第一个元素时,这种变化也反映到了始数组上[^4]。 然而需要注意的是,如果尝试重新分配一个新的对象给这个引用,则不会影响来的对象。这是因为新赋值只会影响局部的方法内的引用副本,而不会改变始引用所指的对象。 ```java public static void reassignReference(int[] newArray){ newArray = new int[]{7,8,9}; // 创建新的数组并将引用赋予newArray } public static void main(String[] args) { int[] originalArray = {1,2,3}; reassignReference(originalArray); System.out.println(Arrays.toString(originalArray)); // 输出仍为 [1, 2, 3] } ``` 这里可以看到,尽管我们在 `reassignReference` 方法里创建了一个全新的数组,并让 `newArray` 指向它,但这并不会影响到 `originalArray` 所指向的那个数组。 ### 总结 - 对于基本数据类型来说,Java 是完全按照值传递的方式工作的。 - 针对引用数据类型,表面上看像是引用传递,但由于真正发生的事情是把引用本身的值进行了复制后再传递出去,严格意义上讲依然是值传递的一种表现形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值