美文网首页
四、java中的参数传递问题

四、java中的参数传递问题

作者: lifeline张 | 来源:发表于2019-04-01 11:37 被阅读0次

    一、先下结论:

    基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的;在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

    相关文章

      网友评论

          本文标题:四、java中的参数传递问题

          本文链接:https://www.haomeiwen.com/subject/qunmbqtx.html