java学习02-传值调用和传址调用

来源:互联网 发布:数据科学入门 mobi 编辑:程序博客网 时间:2024/05/22 02:29

传值调用

传值调用不会改变变量的值,在函数弹栈后,原变量的值不变。

class Demo

{

      public static void main(String[] args)

       {

            int x = 6;

            show(x);                                               //在此函数进栈(被调用)时,x值得暂时会变成5,在函数弹栈(调用结束)后,变量的值依旧是6。

            System.out.println(x);   

       }

 

 publicstatic void show(int x)                       //这里的x仅仅只是一个参数而已,实际上这里把x换成abcd什么都行

   {                       

        x= 5;

     }

}

 

Q:为什么传值调用没有改变原变量的值?

A:实际上,在执行show(x)时,传入括号里的x是原变量的一个副本,在show函数内部只是改变了x的副本,在show弹栈后,改变的副本就消失了,原来“真身”x是没有发生任何变化的。

此处贴上相应的C++代码供理解。

上面的代码里,传入show的是x的副本,用a代表。a是5,和原来x是几并没有关系,所以值不变,依旧是5。

 

 

传址调用

传址调用会改变变量的值,在函数弹栈后,原变量的值改变。

 

class Demo

{

      int x = 6;

      public static void main(String[] args)

       {

           Demo d = new Demo();

           d.x = 8;

           show(d); //此函数被传入的参数值为对象d的地址,函数对地址的操作

               //是永久性的,在该函数弹栈后,原变量值发生改变。

           System.out.println(d.x);

       }

      public static void show(Demo d) //被传入的参数值为对象d的地址,

       {                          //该函数操作d的地址,将其成员变

           d.x = 5;                  //量x的值更改为5,改变是永久性的

       }

}

 

 

Q:为什么传址调用改变了原变量的值?

A:在执行show(Demo d)时,传入括号里的是对象d的地址,对地址的操作就是对内存的操作,它不像操作变量值的副本一样,在函数出栈后副本就消失,对地址的操作会直接永久性的改变内存中的值。

处贴上相应的C++代码供理解。

上面的代码里,传入show的是x的地址,用a代表。对地址a的操作就是对原变量所在内存的操作,改变是永久性的。

 

 

阅读全文
2 0
原创粉丝点击