真正弄懂参数传递

来源:互联网 发布:蒙古骑兵为什么知乎 编辑:程序博客网 时间:2024/05/16 14:50

     题记:上午去面试,又见笔试,看着就头疼。试题里有关于参数传递的内容,不好意思,我答错了。以前也看过资料,但理解不深,最后导致今天上午失利,所以下决心搞清楚,理解透彻,翻资料加自己的代码测试,终于懂了。

 

     首先说明:java中,方法参数传递是“引用的拷贝的传递”,也就是说把当前的引用拷贝一份,传递给方法。

 

     下边的是上午的例题:

      public class foo{

          public void setStr(String str){

               str = "welcome!";

          }

 

          public static void main(String args[]){

               foo f = new foo();

               String str = new String("123");//要理解这里是两个对象,一个是栈内存中的123的引用对象,即str的值,

                                                        //一个是堆内存在的"123"对象本身。

               f.setStr(str);

               System.out.println(str);// 这里打出的是什么?我回答:welcome, 你呢?

          }

      }

 

      回来后自己测试了一下,结果居然是123!

 

      所以很不理解,经过一翻查找,终于知道为什么了:

     

      在调用setStr()方法的时候,只是把当前串“123”的在堆内存中的首地址,比如:0088:2211,即“引用地址”,(也就是str的值,保存在栈内存中)拷贝了一份,把拷贝出的这份传给setStr()方法,注意这句话,这里传的,只是引用地址的拷贝,由于仅仅是一个拷贝,所以在setStr()方法中的赋值操作影响不到main方法在str的内容。

 

       经过分析,认为传的是把当前串值"123"复制一份放到堆中,然后把该堆的引用地址传递给setStr()方法

 

      做了好几年开发了,连这个也不知道,实在是让人脸红!

 

      上一个对象在内存中地址分配图:内存分配

 

 

原创粉丝点击