Java---值传递与引用传递

本文详细讲解了Java中的值传递和引用传递。值传递时,局部变量的副本在栈内存中创建,方法内对参数的修改不会影响原始变量。引用传递则涉及堆内存,方法参数实际上是对象的引用,方法内对成员变量的修改会直接影响到原始对象。此外,String的传递被视为特殊的引用传递,因为字符串对象不可变,方法内创建了新的字符串对象,导致堆内存中的地址发生变化。
摘要由CSDN通过智能技术生成

一、值传递

        值传递,是在栈内存里边存放值。

public class Test {
    public static void main(String []args) {
		int x=10;
		method(x);
       System.out.println("x=" + x);
    }
	public static void method(int mx){
		mx =20;
	}
}

        程序运行结果为 10。具体的内存占用分析如下图:

         前两节我们有说到,在方法中定义或者方法的参数都属于局部变量,存放在栈内存中。因此,这里的 x 与 mx 都属于局部变量。

        method( )函数将 x 的值传给了 mx,但是 method() 函数内部,mx 又被赋值为 20。所以,被改变的是 mx 这个局部变量,x 的值并没有被改变。

二、引用传递

        引用传递,变量在栈内存里边存放的是地址,堆内存里边。

public class Test {
    public static void main(String []args) {
		Duck d = new Duck();
		method(d);
       System.out.println("Duck age=" + d.age);
    }
	public static void method(Duck duck){
		duck.age =5;
	}
}

class Duck{
	int age = 2;
}

        程序运行结果为 5。具体的内存占用分析如下图:

         在类中定义的变量属于成员变量,存放在堆内存。最开始 new得到的 d对象的成员变量age的值是 2。调用method方法时将对象 d 传递为method的参数duck,duck在栈内存里存放与d相同的内容,即指向age的堆内存地址。然后,在method方法内部,duck对象修改了成员变量age为 5。

三、String传递

        String传递是特殊的引用传递。

public class Test {
    public static void main(String []args) {
		String name = "小飞";
		method(name);
       System.out.println(" name = " +name);
    }
	public static void method(String sname){
		sname = "小备";
	}
}

这个时候,堆内存存放的地址会发生改变。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值