Posted on 2011-09-24 10:41
Shuffy 閱讀(688)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
在線推薦閱讀
原文地址:http://blog.csdn.net/luoleicn/article/details/6077512
我聽說過這么一句話,“Java函數(shù)傳參都是傳遞引用。”,貌似還很流行。不知道是不是Java沒有指針概念的緣故,總之如果你學(xué)過C++,那就要記住,Java對(duì)象在函數(shù)間的傳遞不同于C++概念中的傳遞引用,如果不懂C++,無視這篇blog。不想糾結(jié)于概念,看例子。
Java代碼:
- public class Test {
- int a;
- public Test()
- {
- a = 0;
- }
- public Test(int a)
- {
- this.a = a;
- }
- public void setA(int a)
- {
- this.a = a;
- }
- public int getA()
- {
- return this.a;
- }
- public static void test(Test passA) {
- passA = new Test(99);
- }
- public static void main(String[] args) {
- Test t = new Test();
- t.setA(100);
- System.out.println(t.getA());
- test(t);
- System.out.println(t.getA());
- }
- }
運(yùn)行輸出為:
100
100
可見雖然在test里為passA賦值了一個(gè)新的對(duì)象,但是函數(shù)運(yùn)行完后,顯然對(duì)象并沒有發(fā)生變化。
第二段Java例子:
- public class Test {
- int a;
- public Test()
- {
- a = 0;
- }
- public Test(int a)
- {
- this.a = a;
- }
- public void setA(int a)
- {
- this.a = a;
- }
- public int getA()
- {
- return this.a;
- }
- public static void test(Test passA) {
- passA.setA(99);
- }
- public static void main(String[] args) {
- Test t = new Test();
- t.setA(100);
- System.out.println(t.getA());
- test(t);
- System.out.println(t.getA());
- }
- }
這次在test里沒有改變對(duì)象,而是調(diào)用對(duì)象方法,為成員變量賦值,輸出結(jié)果為:
下面看一段C++的傳引用例子:
- #include <iostream>
- using namespace std;
- class Test
- {
- private:
- int m_a;
- public:
- Test(int a=0){m_a = a;}
- void setA(int a){m_a = a;}
- int getA(){return m_a;}
- };
- void test(Test* & t)
- {
- t = new Test(99);
- }
- int main(int args, char** argv)
- {
- Test* t = new Test();
- t->setA(100);
- cout << t->getA() << endl;
- test(t);
- cout << t->getA() << endl;
- return 0;
- }
在test函數(shù)中傳遞引用,同樣是賦予一個(gè)新的對(duì)象,但是結(jié)果不同于Java的結(jié)果:
100
99
用C++的思維來理解Java,java中的每一個(gè)類Object的實(shí)例obj相當(dāng)于對(duì)一個(gè)Object類的指針,在函數(shù)中直接傳遞這個(gè)指針,可以改變指針指向地址的值,但直接修改指針本身是沒有用的,因?yàn)橹羔樖莻髦祩鬟f過去的,在函數(shù)內(nèi)保存了這個(gè)這個(gè)指針的副本。
C++的傳引用不同,比如:
void func(T & t)
{
//some code
t = x;
}
實(shí)現(xiàn)相當(dāng)于
void func(T * pt)
{
//some code;
*pt = x;
}