1、前言
看到標(biāo)題滿腦大大的疑問(wèn) 如上圖 是個(gè)什么鬼。今天我們就來(lái)介紹一下對(duì)象的類型用與區(qū)分你的對(duì)象。
2、對(duì)象的類型
2.1、數(shù)據(jù)類型
基礎(chǔ)類型與數(shù)據(jù)類型
八種基本數(shù)據(jù)類型:
int、short、float、double、long、boolean、byte、char。
對(duì)應(yīng)的封裝類是:
Integer、Short、Float、Double、Long、Boolean、Byte、Character。
2.2、形參和實(shí)參
從作用域上看,形參只會(huì)在方法內(nèi)部生效,方法結(jié)束后,形參也會(huì)被釋放掉,所以形參是不會(huì)影響方法外的.
2.3、值傳遞和引用傳遞
值傳遞:
傳遞的是實(shí)際值,像基本數(shù)據(jù)類型
引用傳遞:
將對(duì)象的引用作為實(shí)參進(jìn)行傳遞
java基本類型數(shù)據(jù)作為參數(shù)是值傳遞,對(duì)象類型是引用傳遞
實(shí)參是可以傳遞給形參的,但是形參卻不能影響實(shí)參。
當(dāng)進(jìn)行值傳遞的情況下,改變的是形參的值,并沒(méi)有改變實(shí)參,無(wú)論是引用傳遞還是值傳遞,只要更改的是形參本身,那么都無(wú)法影響到實(shí)參的。
對(duì)于引用傳遞而言,不同的引用可以指向相同的地址,通過(guò)形參的引用地址,找到了實(shí)際對(duì)象分配的空間,然后進(jìn)行更改就會(huì)對(duì)實(shí)參指向的對(duì)象產(chǎn)生影響。
對(duì)于swap1從值傳遞的角度來(lái)看,對(duì)象參數(shù)傳遞采用的是引用傳遞,那么type1和type2傳遞過(guò)來(lái)的是指向?qū)ο蟮囊茫?strong>在方法內(nèi)部,直接操作形參,交換了形參的內(nèi)容,這樣形參改變,都是并沒(méi)有對(duì)實(shí)參產(chǎn)生任何影響,也沒(méi)有改變對(duì)象實(shí)際的值,所以,結(jié)果是無(wú)法交換
而對(duì)于swap2,對(duì)象引用作為形參傳遞過(guò)來(lái)后,并沒(méi)有對(duì)形參做任何的改變,而是直接操作了形參所指向的對(duì)象實(shí)際地址,那這樣,無(wú)論是實(shí)參還是其他地方,只要是指向該對(duì)象的所有的引用地址對(duì)應(yīng)的值都會(huì)改變。
2.4、 拆裝箱
裝箱就是自動(dòng)將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型(int–>Integer)調(diào)用方法:Integer的valueOf(int) 方法
拆箱就是自動(dòng)將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型(Integer–>int)。
調(diào)用方法:Integer的intValue方法在Java SE5之前,如果要生成一個(gè)數(shù)值為10的Integer對(duì)象,必須這樣進(jìn)行:Integer i = new Integer(10);
而在從Java SE5開(kāi)始就提供了自動(dòng)裝箱的特性,如果要生成一個(gè)數(shù)值為10的Integer對(duì)象,只需要這樣就可以了:
3、 Java對(duì)象的生命周期
- 創(chuàng)建階段(Created)
- 應(yīng)用階段(In Use)
- 不可見(jiàn)階段(Invisible)
- 不可達(dá)階段(Unreachable)
- 收集階段(Collected)
- 終結(jié)階段(Finalized)
- 對(duì)象空間重分配階段(De-allocated)
3.1、創(chuàng)建階段(Created)
在創(chuàng)建階段系統(tǒng)通過(guò)下面的幾個(gè)步驟來(lái)完成對(duì)象的創(chuàng)建過(guò)程
為對(duì)象分配存儲(chǔ)空間
- 開(kāi)始構(gòu)造對(duì)象
-從超類到子類對(duì)static成員進(jìn)行初始化
-超類成員變量按順序初始化,遞歸調(diào)用超類的構(gòu)造方法
-子類成員變量按順序初始化,子類構(gòu)造方法調(diào)用
-一旦對(duì)象被創(chuàng)建,并被分派給某些變量賦值,這個(gè)對(duì)象的狀態(tài)就切換到了應(yīng)用階段
3.2、應(yīng)用階段(In Use)
對(duì)象至少被一個(gè)強(qiáng)引用持有著。
3.3、不可見(jiàn)階段(Invisible)
當(dāng)一個(gè)對(duì)象處于不可見(jiàn)階段時(shí),說(shuō)明程序本身不再持有該對(duì)象的任何強(qiáng)引用,雖然該這些引用仍然是存在著的。簡(jiǎn)單說(shuō)就是程序的執(zhí)行已經(jīng)超出了該對(duì)象的作用域了。
3.4、不可達(dá)階段(Unreachable)
對(duì)象處于不可達(dá)階段是指該對(duì)象不再被任何強(qiáng)引用所持有。
與“不可見(jiàn)階段”相比,“不可見(jiàn)階段”是指程序不再持有該對(duì)象的任何強(qiáng)引用,這種情況下,該對(duì)象仍可能被JVM等系統(tǒng)下的某些已裝載的靜態(tài)變量或線程或JNI等強(qiáng)引用持有著,這些特殊的強(qiáng)引用被稱為”GC root”。存在著這些GC root會(huì)導(dǎo)致對(duì)象的內(nèi)存泄露情況,無(wú)法被回收。
3.5、收集階段(Collected)
當(dāng)垃圾回收器發(fā)現(xiàn)該對(duì)象已經(jīng)處于“不可達(dá)階段”并且垃圾回收器已經(jīng)對(duì)該對(duì)象的內(nèi)存空間重新分配做好準(zhǔn)備時(shí),則對(duì)象進(jìn)入了“收集階段”。如果該對(duì)象已經(jīng)重寫(xiě)了finalize()方法,則會(huì)去執(zhí)行該方法的終端操作。
注意:不要重載finazlie()方法!因?yàn)椋?/p>
- 會(huì)影響JVM的對(duì)象分配與回收速度 在分配該對(duì)象時(shí),JVM需要在垃圾回收器上注冊(cè)該對(duì)象,以便在回收時(shí)能夠執(zhí)行該重載方法;在該方法的執(zhí)行時(shí)需要消耗CPU時(shí)間且在執(zhí)行完該方法后才會(huì)重新執(zhí)行回收操作,即至少需要垃圾回收器對(duì)該對(duì)象執(zhí)行兩次GC。
- 可能造成該對(duì)象的再次“復(fù)活” 在finalize()方法中,如果有其它的強(qiáng)引用再次持有該對(duì)象,則會(huì)導(dǎo)致對(duì)象的狀態(tài)由“收集階段”又重新變?yōu)椤皯?yīng)用階段”。這個(gè)已經(jīng)破壞了Java對(duì)象的生命周期進(jìn)程,且“復(fù)活”的對(duì)象不利用后續(xù)的代碼管理。
3.6、終結(jié)階
當(dāng)對(duì)象執(zhí)行完finalize()方法后仍然處于不可達(dá)狀態(tài)時(shí),則該對(duì)象進(jìn)入終結(jié)階段。在該階段是等待垃圾回收器對(duì)該對(duì)象空間進(jìn)行回收。
3.7、對(duì)象空間重新分配階段
垃圾回收器對(duì)該對(duì)象的所占用的內(nèi)存空間進(jìn)行回收或者再分配了,則該對(duì)象徹底消失了,稱之為“對(duì)象空間重新分配階段”。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-413742.html
4 、結(jié)語(yǔ)
各位看官今天就到此為止,你應(yīng)該知道 你不同時(shí)期寫(xiě)的對(duì)象是啥種了吧,對(duì)應(yīng)也了解他的生命歷程又是如是如何運(yùn)轉(zhuǎn)的了吧。此系列簡(jiǎn)要筆記后續(xù)會(huì)不斷更新,?? 歡迎關(guān)注:??點(diǎn)贊??收藏??留言!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-413742.html
到了這里,關(guān)于看看你的對(duì)象是啥種,他的生命歷程又是怎樣的呢?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!