Java值传递

Java值传递?

基本类型作为参数传递

public class Test1 {
public static void main(String[] args) {
int n = 3;
System.out.println("Before change, n = " + n);
changeData(n);
System.out.println("After changeData(n), n = " + n);
}
public static void changeData(int nn) {
nn = 10;
}
}

我想这个例子大家都明白,基本类型作为参数传递时,是传递值的拷贝(比如拷贝的文本,怎么改变,元文本都不会变),无论你怎么改变这个拷贝,原值是不会改变的,输出的结果证明了这一点:
Before change, n = 3
After changeData(n), n = 3

值传递-传递的是一份拷贝(副本,跟原件没有关系),跟原来的没有什么关系

然后传对象是传地址值(也是一个值),只不过这个地址值指向的是一个对象,对象改变,指向他的地址值也改变

### Java值传递与引用传递的区别及实现机制 #### 一、概念区分 在讨论Java中的参数传递时,重要的是要明白Java采用统一的方式——按值调用(call by value)[^1]。这意味着无论何时向方法传递参数,实际上传递给该方法的都是原始数据类型的副本或者是对象引用的一个复制。 对于基本数据类型而言,当作为实参传给形参的时候,会创建一个新的变量来保存这个数值;而对于引用类型,则是将指向堆内存中某个位置的对象地址复制一份交给函数内部使用[^2]。 #### 二、具体表现形式 - **基本数据类型** 当把一个基础数据类型(比如int, float等)当作参数传递给另一个方法时,实际上是在栈桢(stack frame)里创建了一个新的局部变量并赋予其相同的初始值。因此,在被调用的方法内对该参数所做的任何修改都不会影响到原变量的内容。 ```java public static void changeValue(int num){ num = 10; } int a = 5; changeValue(a); System.out.println(a); // 输出仍然是5 ``` - **引用数据类型** 对于像数组或自定义类这样的复杂结构体来说,情况稍微有些不同。虽然也是按照值来进行传递,但是这里所说的“值”,指的是对这些实体所持有的引用而非实体本身。换句话说,就是两个不同的地方持有同一个物体的位置信息。所以如果在一个方法体内改变了由这个引用指向的数据成员,则这种变化也会反映在外面可见的状态上。 不过要注意一点,即使可以改变对象状态,也无法让外部指针重新指向其他实例。因为传递过来的只是原有引用的一份拷贝而已。 ```java class Person { String name; Person(String n) { this.name = n; } @Override public String toString() { return "Person{name='" + name + "'}"; } } public static void modifyObject(Person p) { p.name = "John"; } // 测试代码如下: Person person = new Person("Alice"); modifyObject(person); System.out.println(person.toString()); // 结果为:Person{name='John'} ``` #### 三、深浅拷贝介绍 为了更好地理解和处理涉及可变对象的情况,还需要掌握关于深拷贝(deep copy) 和 浅拷贝(shallow copy)的知识点: - **浅拷贝**是指只复制最外层容器内的元素而不深入到底部层次去逐级构建新对象的过程。简单来讲就是在不破坏原来关系的前提下建立了一套平行映射表单。这样做可能会导致多个看似独立却共享某些部分资源的现象发生。 - **深拷贝**则是完全重建整个树状图谱下的每一个节点直至叶端为止的操作模式。它能够确保源目标之间没有任何关联性存在从而达到真正意义上的隔离效果。 由于Java默认提供的是浅拷贝功能,所以在需要执行深层次克隆操作之前应当先确认当前环境是否支持序列化接口(Serializable),然后再考虑利用第三方库或者手动编码的方式来完成这项任务[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿甘带你学java

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值