java方法调用都是值传递的理解

来源:互联网 发布:程序员能自学吗 编辑:程序博客网 时间:2024/05/01 06:41

java中对象在调用方法的时候都是值传递,不存在引用传递,先上个例子说明下问题

下面是ParaPassTest.java文件内容:

package com.mzbonnt.basicdatatype;/** * java 参数传递测试,java中只有值传递,没有引用传递 * @author hp * */public class ParaPassTest {private int para;/** * @return the para */public int getPara() {return para;}/** * @param para the para to set */public void setPara(int para) {this.para = para;}}
下面是ParaPassDemo.java文件内容:
package com.mzbonnt.basicdatatype;public class ParaPassDemo {private static void paraPassByValue(ParaPassTest pt1, ParaPassTest pt2){pt1 = pt2;System.out.println("pt1->para:" + pt1.getPara() + "------pt2->para:" + pt2.getPara());}/** * @param args */public static void main(String[] args) {ParaPassTest ppt1 = new ParaPassTest();ppt1.setPara(30);ParaPassTest ppt2 = new ParaPassTest();ppt2.setPara(60);paraPassByValue(ppt1, ppt2);System.out.println("ppt1->para:" + ppt1.getPara() + "------ppt2->para:" + ppt2.getPara());}}
下面是程序执行结果:

pt1->para:60------pt2->para:60
ppt1->para:30------ppt2->para:60

如果java存在引用传递的话,ppt1和ppt2的para值应该相等,而程序最后结果显示却不相等,说明java调用方法时参数都是值传递。

分析:程序执行paraPassByValue(pt1, pt2)的时候,是把ppt1对象和ppt2对象的地址值传递过去了,分别赋给pt1和pt2,是一个值传递,pt1 = pt2只是把pt2的值赋给pt1,此时pt1和pt2的值都是ppt2对象的地址值,因此在paraPassByValue方法中打印结果的时候输出的值都是一样的(都是ppt2对象的para值),paraPassByValue方法执行结束后,在main方法中再一次打印的时候,是打印ppt1对象和ppt2对象的para值,而这两个对象的para值从未改变过,因此还是保持原来的结果没有发生变化。

再看下面一个例子,修改ParaPassDemo.java,下面是修改后的文件内容:

package com.mzbonnt.basicdatatype;public class ParaPassDemo {private static void paraPassByValue(ParaPassTest pt1, ParaPassTest pt2){pt1 = pt2;pt2.setPara(pt2.getPara() + 100);System.out.println("pt1->para:" + pt1.getPara() + "------pt2->para:" + pt2.getPara());}/** * @param args */public static void main(String[] args) {ParaPassTest ppt1 = new ParaPassTest();ppt1.setPara(30);ParaPassTest ppt2 = new ParaPassTest();ppt2.setPara(60);paraPassByValue(ppt1, ppt2);System.out.println("ppt1->para:" + ppt1.getPara() + "------ppt2->para:" + ppt2.getPara());}}
下面是程序执行结果:

pt1->para:160------pt2->para:160
ppt1->para:30------ppt2->para:160

分析:程序执行paraPassByValue(pt1, pt2)的时候,把ppt1对象和ppt2对象的地址值传递过去,pt1 = pt2执行后pt1和pt2的值都是ppt2对象的地址值,pt2.setPara(pt2.getPara() + 100)执行后,ppt2对象的para值发生了变化,由60变为160,因此在paraPassByValue方法中打印结果的时候输出的值都是160的(都是ppt2对象的para值),paraPassByValue方法执行结束后,在main方法中再一次打印的时候,是打印ppt1对象和ppt2对象的para值,ppt1对象的para值没有发生过变化,ppt2对象的para值变成160,,因此最终结果一个是30,一个是160

0 0