值传递和引用传递

java中没有指针,所以好像java不像其他语言那样有明确区分值传递和引用传递,在这里,刚看了一本书本人觉得说的很清楚。
值传递和引用传递区别就是改不改变原对象的问题。
值传递:方法调用时使用的只是对象的一个副本,所以值传递不会改变对象本身。
public class Test1 {
public static void main(String args[]){
int x=15;
System.out.println("change方法调用前:"+x);
change(x);
System.out.println("change方法调用后:"+x);
}

private static void change(int y) {
y=20;

}
}
程序结果:
change方法调用前:15
change方法调用后:15

传递的是int型对象,但int x内容已被声明,其不可改变。改变的只是内存指向。

其内存操作如图所示:

[img]http://dl.iteye.com/upload/attachment/0083/2763/e7ee2862-a621-328d-a01f-e9f1b85fe42d.jpg[/img]


引用传递:其传递的是对象的的引用或者说对象的首地址传递给方法,会改变对象内容。
class Num{
int Temp=15;
}
public class Test2 {
public static void main(String args[]){
Num n1=new Num();
n1.Temp=20;
System.out.println("change方法调用前:"+n1.Temp);
change(n1);
System.out.println("change方法调用后:"+n1.Temp);
}

private static void change(Num n2) {
n2.Temp=30;

}
}
程序结果
change方法调用前:20
change方法调用后:30

在change()方法中,接受的是对象n1,并将其属性内容作了修改。

其内存操作如图所示:

[img]http://dl.iteye.com/upload/attachment/0083/2769/4ebceed8-8fa7-312c-a794-7d79e79ecfcd.jpg[/img]
值传递是指在调用函数时将实际参数复制一份传递到函数中,在函数中如果对参数进行修改,不会影响到实际参数。引用传递则是在调用函数时将实际参数的地址直接传递到函数中,在函数中对参数所进行的修改,会影响到实际参数[^2]。 两者的区别并不是传递的内容,而是实参到底有没有被复制一份给形参。判断实参内容有没有受影响时,若传递的是地址,要看这个地址的变化是否有影响,而非地址指向的对象的变化[^3]。 在应用方面,值传递可避免函数内部修改影响外部数据,保证数据的安全性独立性,例如在Java中对基本数据类型的参数传递多采用值传递引用传递可以直接修改原始数据,避免大量数据的复制,提高效率,像C++中通过引用传递参数来实现对变量的交换操作,当调用 `order(n1, n2)` 函数时,传递的是 `n1` `n2` 的引用,函数内部对参数的修改会直接反映到原始变量上[^1][5]。 以下是值传递引用传递的代码示例: ```java // 值传递示例 public class TestOne { public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); } } // C++引用传递示例 #include <iostream> void order(int& numb1, int& numb2) { if (numb1 > numb2) { int temp = numb1; numb1 = numb2; numb2 = temp; } } int main() { int n1 = 5; int n2 = 3; order(n1, n2); std::cout << "n1 = " << n1 << std::endl; std::cout << "n2 = " << n2 << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值