当前位置: 首页 > 科技观察

Java参数是按值传递的吗?引用传递

时间:2023-03-14 15:18:04 科技观察

有时候我会想java在调用一个方法的时候到底是传值还是引用传递。之前有人说基本数据类型是值传递,引用类型是引用传递。有一段时间,这一切似乎都合情合理。笔者在这里不追求文字的辨别能力和识字能力,而是阐述一下我对这个问题的理解。我不想说是按值传递还是按引用传递。自己理解就好了。毕竟会用java才是王道。先看下面代码:packageshb.java.testmemory;publicclassTestMeo{/**测试基本数据类型和引用类型参数传值*@Description:*@authorshaobn*@paramargs*@Date:2015-9-8AM7:53:56*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtestInt();testStr();testPack();testObj();testObj_2();}//NO1.测试基本数据类型publicstaticvoidtestInt(){intnum1=12;System.out.println("Beforechange::"+num1);changeInt(num1);System.out.println("Afterchange::"+num1);}//测试字符串类型publicstaticvoidtestStr(){Stringstr="helloworld";System.out.println("Beforechange::"+str);changeStr(str);System.out.println("Afterchange::"+str);}//测试包装类型publicstaticvoidtestPack(){Integerinteger=newInteger(42);System.out.println("Beforechange::"+integer);changePack(integer);System.out.println("Afterchange::"+integer);}//测试引用类型publicstaticvoidtestObj(){Personperson=newPerson();System.out.println("Beforechange::"+person.age);changeObj(person);System.out.println("Afterchange::"+person.age);}//测试引用类型方法2publicstaticvoidtestObj_2(){Personperson=newPerson();System.out.println("Beforechange::"+person.age);changeObj_2(person);System.out.println("Afterchange::"+person.age);}publicstaticvoidchangeInt(intnum){num=21;}publicstaticvoidchangeStr(Stringstr){str="hellobeijing";}publicstaticvoidchangePack(Integerinteger){integer=newInteger(89);}publicstaticvoidchangeObj(Personperson){person.age=87;}publicstaticvoidchangeObj_2(Personperson){person=newPerson();person.age=78;}}//引用类型测试类classPerson{publicintage=78;}看NO1:    说明一下:我上面画的两张图实在不行,只能这样了。我们分析一下:当数据是基本数据类型时,我们传递给形参的只是一个实参的拷贝(Copy),当然由于栈内存变量的共享特性,这两个变量共同指向这个变量值。当我们改变形参时,首先会在栈内存中查找是否有新的变量值,如果有则指向新的变量值(体现栈内存数据共享的特点)。如果不是,则在栈内存中开辟一块空间存放新的变量值,形参变量会指向新的变量值。这时我们发现,此时的变量值与实参的变量无关,两个自变量。因此,通过函数后改变的变量值与之前的没有任何关系,所以输出仍然是之前的变量值。另外,我们看到在传递对象的引用时,person引用变量中存放的是Person对象在堆内存中的内存地址,所以传递的是内存地址(笔者理解为一串数字).这时两个形参变量有一个共同的内存地址值,所以指向同一个内存对象。我们观察到,当我们改变一个对象中某个属性的值时,会有一种牵一发而动全身的感觉。只要改变这个对象,这个对象就会改变,没有创建另一个对象的概念(String类型和包装类型除外)。PS:还没写完呢,工作中,晚上再写!如有错误,请帮助更正。