Posted on 2011-01-29 21:36
leekiang 閱讀(584)
評(píng)論(0) 編輯 收藏 所屬分類:
java
1,java體系結(jié)構(gòu)包括四個(gè)獨(dú)立但相關(guān)的技術(shù):java語(yǔ)言、class文件格式、java的api、java虛擬機(jī)
2,java虛擬機(jī)是一臺(tái)抽象的計(jì)算機(jī),主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。不同的java虛擬機(jī),其執(zhí)行引擎的實(shí)現(xiàn)可能不一樣。分為軟件實(shí)現(xiàn)和硬件實(shí)現(xiàn)(內(nèi)嵌在芯片),軟件實(shí)現(xiàn)有以下幾種:(1)每次都會(huì)解釋字節(jié)碼(2)即時(shí)編譯,即編譯成本低機(jī)器代碼,緩存起來(lái)可以重用(3)自適應(yīng)優(yōu)化器
3,每一個(gè)類被裝載的時(shí)候,java虛擬機(jī)都監(jiān)視這個(gè)類,看它到底是被啟動(dòng)(bootstrap)類裝載器還是被用戶定義類裝載器裝載。當(dāng)被裝載的類引用了另外一個(gè)類時(shí),虛擬機(jī)就會(huì)使用裝載第一個(gè)類的類裝載器裝載被引用的類。由于java虛擬機(jī)采用這種方式進(jìn)行類的加載,所以被裝載的類默認(rèn)情況下只能看到被同一個(gè)類裝載器裝載的類。通過(guò)這種方法,java的體系結(jié)構(gòu)允許在一個(gè)java應(yīng)用程序中建立多個(gè)命名空間。運(yùn)行時(shí)的java程序中的每一個(gè)類裝載器都有它自己的命名空間。
例子:瀏覽器上的java虛擬機(jī)為不同的網(wǎng)絡(luò)地址創(chuàng)建不同的用戶定義類裝載器,用來(lái)裝載不同來(lái)源的class文件,這種不同網(wǎng)址的applet就不會(huì)相互影響。
問(wèn)題:1)自己寫的類如果調(diào)用了java的api,那么類裝載器是一個(gè)什么樣的情況。同一個(gè)類可能被不同的類裝載器裝載?
????? 2)看一下tomcat的類裝載器的實(shí)現(xiàn)
?? ?? 3)java的虛擬機(jī)與ruby和python的有何區(qū)別?
?? ?? 4)有沒(méi)有一種打包工具,把java代碼打包成不需要java虛擬機(jī)的本地可執(zhí)行代碼
?? ?? 5)java的動(dòng)態(tài)連接和動(dòng)態(tài)擴(kuò)展指的是什么?
4,java語(yǔ)言的特殊之處是程序既被編譯又被解釋。首先,編譯器將程序編譯為一種稱之為java字節(jié)碼(bytecode)的與平臺(tái)無(wú)關(guān)的中間語(yǔ)言。解釋器分析并運(yùn)行每條java字節(jié)碼指令。編譯只發(fā)生一次;而解釋在每次執(zhí)行程序時(shí)都會(huì)執(zhí)行(通常是如此,具體實(shí)現(xiàn)可能不一樣)。
12,聲明一個(gè)對(duì)象時(shí)不會(huì)運(yùn)行類的靜態(tài)區(qū)塊,在以下情況下會(huì)運(yùn)行靜態(tài)區(qū)塊:
??? 1)new一個(gè)對(duì)象時(shí);
??? 2)調(diào)用靜態(tài)方法時(shí);
??? 3)Class.forName("類名")
參考
1,http://xyiyy.javaeye.com/blog/362092
2,http://xyiyy.javaeye.com/blog/362107