java按值传递_Java参数按值传递?按引用传递

有时候在想,java在调用方法时候究竟是按值传递还是按引用传递,之前有人说是基本数据类型按值传递,引用类型按引用传递。一时间,似乎都有道理。

笔者在此不追究字眼上的辨别识字能力,把自己对这个问题的理解阐述一下,笔者不想说这是按值传递还是按引用传递,自己理解就好了吧,毕竟java会用才是王道。

先看一下下面的代码:

packageshb.java.testmemory;

publicclassTestMeo {

/**测试基本数据类型以及引用类型参数按值传递

* @Description:

* @author shaobn

* @param args

* @Date:2015-9-8 上午7:53:56

*/

publicstaticvoidmain(String[] args) {

// TODO Auto-generated method stub

testInt();

testStr();

testPack();

testObj();

testObj_2();

}

//NO1.测试基本数据类型

publicstaticvoidtestInt(){

intnum1 =12;

System.out.println("Before change::"+num1);

changeInt(num1);

System.out.println("After change::"+num1);

}

//测试字符串类型

publicstaticvoidtestStr(){

String str = "helloworld";

System.out.println("Before change::"+str);

changeStr(str);

System.out.println("After change::"+str);

}

//测试包装类型

publicstaticvoidtestPack(){

Integer integer = newInteger(42);

System.out.println("Before change::"+integer);

changePack(integer);

System.out.println("After change::"+integer);

}

//测试引用类型

publicstaticvoidtestObj(){

Person person = newPerson();

System.out.println("Before change::"+person.age);

changeObj(person);

System.out.println("After change::"+person.age);

}

//测试引用类型方式二

publicstaticvoidtestObj_2(){

Person person = newPerson();

System.out.println("Before change::"+person.age);

changeObj_2(person);

System.out.println("After change::"+person.age);

}

publicstaticvoidchangeInt(intnum){

num = 21;

}

publicstaticvoidchangeStr(String str){

str = "hellobeijing";

}

publicstaticvoidchangePack(Integer integer){

integer = newInteger(89);

}

publicstaticvoidchangeObj(Person person){

person.age = 87;

}

publicstaticvoidchangeObj_2(Person person){

person = newPerson();

person.age = 78;

}

}

//引用类型测试类

classPerson{

publicintage =78;

}

Look NO1:

d737798a8e6b60dc052a999c54558635.png

7nuqctEvqVkAAAAASUVORK5CYII=

说明一下:笔者在上面画的两张图着实不咋样,只能做到这种程度了。我们分析一下:当数据为基本数据类型时,我们传给形参的仅仅是一个实参的副本(Copy),当然由于栈内存变量共享的特征,这两个变量共同指向此变量值。

当我们对形参进行改变时,首先,在栈内存中会寻找是否存在新的变量值,如果有,则指向新的变量值(体现栈内存数据共享的特点)。如果没有的话,在栈内存中回开辟一块空间,存储新的变量值,同时形参变量会指向新的变量值。

此时我们发现,这时的变量值已经与实参的变量没有关系,两个独立的变量。所以经过函数后改变的变量值与之前的没有关系,故输出的还是之前的变量值。

另外,我们看到,当传递对象的引用时,person引用变量中存储的是Person对象在堆内存中的内存地址,所以传递的是内存地址(笔者理解为是一串数字)。此时两个形参变量是有共同的内存地址值,所以指向同一个内存对象。我们观察

发现,当我们改变对象中的属性值时,有牵一发而动全身的感觉,只要你改变这个对象,这个对象就被改变,而不存在另外开辟一个对象的概念(String类型和包装类型除外)。

PS:还没有写完,正在上班时间,晚上再写吧!

如有错误,请大家帮忙纠正一下。

【编辑推荐】

【责任编辑:wangxueyan TEL:(010)68476606】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值