<强> 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中参数传递方式详解