java参数传递问题

问题描述:在传递java参数的时候如果参数为基本数据类型或者引用数据类型,那么传递完成之后参数本身值是否会发生改变?

代码测验:
1: 传递基本数据类型

package com.test.other;

public class ParamTransfer {

    private int money;

    public static void main(String[] args){
        ParamTransfer pt=new ParamTransfer();
        pt.money=10;
        pt.method(pt.money);

        System.gc();

    }

    public void method(int i) {  //此处为传数值,只是把money的值拷贝给了i
        // TODO Auto-generated method stub
        System.out.println("传入的值:"+i);
        i=i*5;
        System.out.println("改变后的i值:"+i);

        System.out.println("money的值:"+this.money);
    }


}

运行后的输出:
传入的值:10
改变后的i值:50
money的值:10

2:传递引用数据类型

package com.test.other;


 class Time{

     int h;

     int f;

     int s;

     Time(int h, int f, int s){
         this.h=h;
         this.f=f;
         this.s=s;
     }
 }

public class ObjectParamTransfer {

    private Time t;

    public static void main(String[] args){
        ObjectParamTransfer opt=new ObjectParamTransfer();
        opt.t=new Time(11,12,13);

        opt.method(opt.t);

        System.out.println("改变后t的值(方法外): h="+opt.t.h+" f="+opt.t.f+" s="+opt.t.s);

    }

    private void method(Time tt) {  //此处为内存地址传递
        // TODO Auto-generated method stub

        System.out.println("传入后tt值:h="+tt.h+" f="+tt.f+" s="+tt.s);

        tt.h=1;
        tt.f=2;
        tt.s=3;

        System.out.println("改变后tt值:h="+tt.h+" f="+tt.f+" s="+tt.s);

        System.out.println("改变后t的值(方法内): h="+this.t.h+" f="+this.t.f+" s="+this.t.s);
    }

}

运行后输出:
传入后tt值:h=11 f=12 s=13
改变后tt值:h=1 f=2 s=3
改变后t的值(方法内): h=1 f=2 s=3
改变后t的值(方法外): h=1 f=2 s=3

结论:
Java在传递参数的时候都是进行传值调用(在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释(或者查找)到堆中的对象,
这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即:修改的是堆中的数据。所以这个修改是可以保持的了)。基本数据类型是通过复制值进行传递的。

猜你喜欢

转载自blog.csdn.net/qq_31071543/article/details/79962750