java和c++指針的比較


JAVA:它不是沒有指針,而是對指針進行了僞裝:使用上泛化、強化和簡單化,概念上淡化和弱化。。。 C++中可以有對象類型的變量和對象指針類型,兩者的區別如下: Object oo = Object(); Object * oop = new Object(); 也就是說當使用new方式時,是動態爲對象分配內在並將地址賦給oop這個指針變量。 JAVA中只有一種相關類型:對象類型,可是它的表現形式卻是這樣的: Object oo = new Object(); 比較一下,原來它就是使用了C++的動態內在分配方式創建了一個對象,並把地址返回給了oo變量,也就是說oo本質上就是一個指針變量。引申一下:JAVA中的對象類型本質上應該叫做對象指針 類型。那麼傳統的對象類型呢?在JAVA裏已經不見了蹤影!既然沒有了傳統的對象類型,那麼 對象指針變量前面的*也就可以不要了。對象指針變量也就可以簡稱爲對象變量了,反正也不會和其它概念混淆!所有的對象變量都是指針,沒有非指針的對象變量,想不用指針都不行,這就是指針的泛化和強化。不叫指針了,就叫對象變量,這就是概念上的淡化和弱化。沒有了指針的加減運算,也沒有了*、->等運算符,這是對指針的簡單化。 這可以從很多方面得到驗證。首先,JAVA強調所有的對象賦值和傳遞都是引用,解釋如下: Object a=new Object(); 並不是將新生成的對象賦給a,a是對新生成對象的引用。 Object a=new Object(); Object b; b=a; b並不是一個新對象,它是對a對象的引用。好複雜啊!其實呢,a是指針,b也是指針,將a的值賦給b,也就是將a所存儲的地址賦給b,b自然指向了a所指向的對象。其實,JAVA強調兩個對象的相等比較不是比較兩個對象的值是否相同,是比較兩個對象是不是相同的引用。解釋如下: Object a=new Object(); Object b=a; a==b爲真,兩個對象引用相同。 String a=new String("abc"); String b=new String("abc"); a==b爲假,兩個對象引用不同。不太明白是吧--其實呢,==的意義並沒有變。a是指針,b也是指針,a、b存儲的都是地址,當兩個變量存儲了同一個對象的地址時,這兩個地址當然相等,a==b自然是真。當兩個變量存儲了不同對象的地址,這兩個地址值當然不同,a==b自然爲假。然後,一個問題出現了,怎麼生成兩個完全相同的對象呢?在Thinking in Java中用了很長的篇幅去解釋clone的用法,因爲只有克隆才能真正生成兩個完全相同的對象--在C++中本來很簡單的問題變得複雜了--不過也沒什麼,有利必有弊嘛,反正用的時候也不多。最後,再看看鏈表的問題,用C做例子吧(可以移植到C++): struct linktable{ int a; float b; struct linktable c; } 是不行的,因爲在定義c時需要確定它要佔用的內存,struct linktable還沒有定義完,沒法確定,象下面這樣做吧: struct linktable{ int a; float b; struct linktable * c; } c是指針,它佔用的內存大小是固定的,與它指向的數據類型的空間無關,因此可以確定。再看JAVA,號稱沒指針也能做鏈表: class linktable{ int a; float b; linktable c; } 好厲害!其它也沒什麼,不是說了嗎,JAVA的對象變量實質上就是指針變量,c就是個指針: linktable c; 和 struct linktalbe * c; 本質上完全相同! 


發佈了42 篇原創文章 · 獲贊 26 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章