java中参数传递方式详解

  

<强> java中参数传递方式详解

  

java新手入门面临的一个经典的话题,本文意在终结这个话题,java中有说法:java里面参数传递都是按值传递,怎么理解这句话吗?用文字说明恐怕不容易说明白,说明白恐怕也难以想明白。

  

<强>前提

  

先明确一下,按值还是按引用的概念,它是来自c++语言,引用不是汉语词典中的一个词,而是c++的概念——“和”这个符号还记得吧?

  

为什么有这个话题呢?其,一是对按引用传递理解不透彻;其二,诸多java书籍及讨论论点并没有切中要害。

  

一句话概括,按值传参还是按引用传参,既然是参数传递方式,那么只针对形参和实参,这里说的是参数本身,不是参数对象的子对象或孙子对象。

  

<强>有了前提,上c++代码:

        # include & lt; iostream>      使用名称空间性病;      类用户   {   私人:   int m_id;   公众:   用户(int id=0) {m_id=id;}   空白setId (int id) {m_id=id;}   int getId(){返回m_id;}   };      无效电平(用户t){//按值传参   用户年代;   t=s;   t.setId (1002);   cout & lt; & lt;test1:“& lt; & lt;t.getId () & lt; & lt;endl;   }      空白test1(用户* t){//按值传参   t=新用户();//指针指向了一个新对象,外面实参没变   t→setId (1002);   cout & lt; & lt;test1:“& lt; & lt;t→getId () & lt; & lt;endl;   }      空白test2(用户*,t){//按引用传参   t=新用户();//指针指向了一个新对象,外面实参也跟着变了   t→setId (1002);   cout & lt; & lt;”test2:“& lt; & lt;t→getId () & lt; & lt;endl;   }      int主要(int命令行参数个数,const char * argv []) {   cout<& lt;“\ npass裁判:“& lt; & lt; endl;   用户* t=新用户();   t→setId (1001);   cout & lt; & lt;t→getId () & lt; & lt;endl;   test2 (t);   cout & lt; & lt;t→getId () & lt; & lt;endl;      cout<& lt;“价值:\ npass”& lt; & lt; endl;   t=新用户();   t→setId (1001);   cout & lt; & lt;t→getId () & lt; & lt;endl;   test1 (t);   cout & lt; & lt;t→getId () & lt; & lt;endl;   返回0;   }      之前      

<强>输出结果:

        经过裁判:   1001   test2:1002   1002      经过值:   1001   test1:1002   1001      之前      

<强> c++小结:

  

按值传递,那么在函数内修改了形参指向一个新对象,外面的实参不受影响。

  

按引用传递,那么在函数内修改了形参指向一个新对象,外面的实参也变了。

  

旨在说明问题,代码可能有内存泄漏。

  

<强>上java:

        包com.pollyduan.bean;      @ data   公开课用户{   私人整数id;      公共静态孔隙testObject(用户t) {   t=新用户();//指向了一个新对象,外面实参没变   t.setId (1002);   System.out.println (" testObject=" + t);   }      @Test   公共空间testObject () {   用户用户=新用户();   user.setId (1001);   System.out.println用户(“用户=" +);   testObject(用户);   System.out.println用户(“用户=" +);   }   }      之前      

输出结果:

        用户=用户(id=1001)   testObject=用户(id=1002)   用户=用户(id=1001)   之前      

<强> java小结:

  

跟c++的逻辑比较一下,请自行对号入座。

java中参数传递方式详解