java按值传递和按引用传递_Java是按值传递和按引用传递

Java编程语言中最大的困惑之一是java是按值传递(Pass by Value)还是按引用传递(Pass by Reference)。在面试中经常提这个问题,但仍然看到应聘者对此感到困惑。

首先,我们应该理解通过值传递和通过引用传递的含义。

传递值:将方法参数值复制到另一个变量,然后传递复制的对象,它称为按值传递。

通过引用传递:将实际参数的别名或引用传递给方法,它称为按引用传递。

Java总是按值传递而不是通过引用传递,我们可以用一个简单的例子来证明它。

假设有一个类Balloon,如下所示。

public class Balloon {

private String color;

public Balloon(){}

public Balloon(String c){

this.color=c;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

}

下面有一个简单的程序,使用通用方法交换两个对象,该类如下所示。

public class Test {

public static void main(String[] args) {

Balloon red = new Balloon("Red"); //memory reference 50

Balloon blue = new Balloon("Blue"); //memory reference 100

swap(red, blue);

System.out.println("red color="+red.getColor());

System.out.println("blue color="+blue.getColor());

foo(blue);

System.out.println("blue color="+blue.getColor());

}

private static void foo(Balloon balloon) { //baloon=100

balloon.setColor("Red"); //baloon=100

balloon = new Balloon("Green"); //baloon=200

balloon.setColor("Blue"); //baloon = 200

}

//Generic swap method

public static void swap(Object o1, Object o2){

Object temp = o1;

o1=o2;

o2=temp;

}

}

当执行上面的程序时,得到以下输出。

red color=Red

blue color=Blue

blue color=Red

从输出的前两行中,可以很明显swap方法没有起什么作用。这是因为Java是按值传递的,这个swap()方法测试可以与任何编程语言一起使用,以检查它是通过值传递还是通过引用传递。

让我们一步一步地分析程序的执行情况。

Balloon red = new Balloon("Red");

Balloon blue = new Balloon("Blue");

当使用new运算符创建类的实例时,将创建实例,并且变量包含保存对象的内存的引用位置。假设“red”指向50并且“blue”指向100的内存位置,这些是两个Balloon对象的内存位置。

现在,当调用swap()方法时,会创建两个新变量o1和o2,分别指向50和100。

所以下面的代码片段解释了swap()方法执行中发生的事情。

public static void swap(Object o1, Object o2){ //o1=50, o2=100

Object temp = o1; //temp=50, o1=50, o2=100

o1=o2; //temp=50, o1=100, o2=100

o2=temp; //temp=50, o1=100, o2=50

} //method terminated

请注意,上面更改o1和o2的值,但它们是“Blue”和“Red”引用位置的副本,因此实际上“Blue”和“Red”的值没有变化,因此输出也没有变化。

如果已经理解了这一点,可以很容易地理解混乱的原因。由于变量只是对象的引用,我们感到困惑的是传递了引用,因此java是通过引用传递的。但是传递了一个引用的副本,因此它通过了值。

现在让我们分析一下foo()方法的执行情况。

private static void foo(Balloon balloon) { //baloon=100

balloon.setColor("Red"); //baloon=100

balloon = new Balloon("Green"); //baloon=200

balloon.setColor("Blue"); //baloon = 200

}

第一行是重要的一行,当我们调用一个方法时,在引用位置的Object上调用该方法。此时,balloon指向100,因此它的颜色变为Red。

在下一行中,balloon的引用更改为200,并且执行的任何其他方法都发生在存储器位置200处的对象上,并且对存储器位置100处的对象没有任何影响。这解释了我们的程序输出的第三行打印:blue color=Red。

变量是引用或指针,它的副本传递给方法,所以java总是按值传递。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值