四、java中的参数传递问题

2019-04-01  本文已影响0人  lifeline张

一、先下结论:

基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的;在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,而不是把引用本身传进去。

二、基本数据类型的传递实例:

2.1、实例一
public class Test1 {

       public static void main(String[] args) {

        int n = 3;

        System.out.println("Before change, n = " + n);

        changeData(n);

        System.out.println("After changeData(n), n = " + n);

    }

      

       public static void changeData(int n) {

        n = 10;

    }

}

运行结果:


image.png
2.2、实例二
public class ParamTransfer {
     public int money;
        
        public void amethod(int i) {
            System.out.println("方法得到的i的值:" + i);
            i = i * 5;
            System.out.println("方法执行语句i=i*5后i的值:" + i);
            System.out.println("money的值:" + this.money);
        }

        public static void main(String[] args) {
            ParamTransfer pt = new ParamTransfer();
            pt.money = 100;
            pt.amethod(pt.money);
        }
}

运行结果:


image.png
2.3、实例三
package ObjectRef;

public class ObjectRef {

    public static void mothed1(){
        int x=0;
        int y=1;
        switchValue(x,y);
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
    static void switchValue(int a,int b){

        int c=a;
        a=b;
        b=c;
    }
        
    public static void main(String[] args) {
        mothed1();  
    }
}

运行结果:


image.png

三、引用类型的参数传递

3.1、实例一:貌似是按引用传递的实例
package ObjectRef;

public class Test2 {

    public static void main(String[] args) {

     StringBuffer sb = new StringBuffer("Hello ");

     System.out.println("Before change, sb = " + sb);

     changeData(sb);

     System.out.println("After changeData(n), sb = " + sb);

 }
 

    public static void changeData(StringBuffer strBuf) {

     strBuf.append("World!");

 }

}

运行结果:


image.png

从结果来看,sb的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。从上面例子的输出结果来看,这样解释是合理。

3.2、反驳上面的例子
package ObjectRef;

public class Test3 {

    public static void main(String[] args) {

     StringBuffer sb = new StringBuffer("Hello ");

     System.out.println("Before change, sb = " + sb);

     changeData(sb);

     System.out.println("After changeData(n), sb = " + sb);

 }

   

    public static void changeData(StringBuffer strBuf) {

        strBuf = new StringBuffer("Hi ");

        strBuf.append("World!");

 }

}

按照上面例子的经验:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。你会认为应该输出:

Before change, sb = Hello

After changeData(n), sb = Hi World!
但是实际是:
运行结果:


image.png

分析:


image.png
image.png
image.png
image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读