對象創(chuàng)建:Java和C++比較
1、C++創(chuàng)建對象方式
在C++中我們可以采用如下兩種方式來創(chuàng)建對象,
- Dog dog;//Dog為類名
- Dog *p = new Dog();
這兩種方式在C++中都能完成對象的創(chuàng)建,但是在內(nèi)存中的處理卻完全不同。
對于第一種方式而言,dog是被存儲在棧中的,占用的大小是Dog類中成員變量占用內(nèi)存的和,此處不包括成員方法,因?yàn)槌蓡T方法是存放在公共存儲區(qū)以便所有該類的對象都可以訪問的。
圖1 C++創(chuàng)建對象方式1的內(nèi)存分配
對于第二種方式則不同,該方式使用了指針,在定義*p時(shí)在棧中開辟一個(gè)4字節(jié)的空間,new Dog()時(shí)在堆中開辟一塊空間,然后將該空間的首地址賦值給*p,這樣,通過*p就可以找到對象在堆中的任何成員方法了。
圖2 C++創(chuàng)建對象方式2的內(nèi)存分配
2、Java創(chuàng)建對象方式
在C++中我們有兩種創(chuàng)建對象的方式,而在Java中只提供了如下的一種方式,
- Dog dog = new Dog();
JVM在進(jìn)行內(nèi)存管理時(shí),首先會在棧中給dog分配一個(gè)空間,當(dāng)new Dog();后會在堆中開辟對象的實(shí)際空間,然后將dog指向堆中的空間,這樣我們就可以方法對象的成員變量了。
圖3 Java創(chuàng)建對象方式的內(nèi)存分配
3、總結(jié)
通過圖2和圖3我們會發(fā)現(xiàn)Java創(chuàng)建對象的方式和C++創(chuàng)建對象方式的第二種很像,除了我故意寫的p和dog還有數(shù)字,其他的都是一樣的。是這樣的,他們的確很像,但是卻不完全相同,在C++中p是一個(gè)指針,通過指針我們可以訪問內(nèi)存中的任何地址,可以肆意的對內(nèi)存做處理,然而在Java中 dog是一個(gè)引用,可以理解成是C++中指針的一個(gè)封裝,我們不可以想在C++中用指針那樣在Java中直接的進(jìn)行地址++操作,這樣一來就保證了內(nèi)存的安全,這是C++和Java的很大不同。
本人文字功底極弱,若有描述不清或不當(dāng)之處,望大家指正,感謝各位花費(fèi)時(shí)間閱讀完畢。
原文鏈接:http://www.cnblogs.com/1Q84mi/archive/2013/05/15/3080716.html


2009-08-11 14:57:11




