Posted on 2011-09-24 10:41
Shuffy 閱讀(695)
評論(1) 編輯 收藏 引用 所屬分類:
在線推薦閱讀
原文地址:http://blog.csdn.net/luoleicn/article/details/6077512
我聽說過這么一句話,“Java函數傳參都是傳遞引用。”,貌似還很流行。不知道是不是Java沒有指針概念的緣故,總之如果你學過C++,那就要記住,Java對象在函數間的傳遞不同于C++概念中的傳遞引用,如果不懂C++,無視這篇blog。不想糾結于概念,看例子。
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());
- }
- }
運行輸出為:
100
100
可見雖然在test里為passA賦值了一個新的對象,但是函數運行完后,顯然對象并沒有發生變化。
第二段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里沒有改變對象,而是調用對象方法,為成員變量賦值,輸出結果為:
下面看一段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函數中傳遞引用,同樣是賦予一個新的對象,但是結果不同于Java的結果:
100
99
用C++的思維來理解Java,java中的每一個類Object的實例obj相當于對一個Object類的指針,在函數中直接傳遞這個指針,可以改變指針指向地址的值,但直接修改指針本身是沒有用的,因為指針是傳值傳遞過去的,在函數內保存了這個這個指針的副本。
C++的傳引用不同,比如:
void func(T & t)
{
//some code
t = x;
}
實現相當于
void func(T * pt)
{
//some code;
*pt = x;
}