本人總結(jié):
面向?qū)ο?封裝,繼承,多態(tài))
平臺(tái)無(wú)關(guān)性(jvm運(yùn)行,class文件)
語(yǔ)言(泛型,lambda)
類庫(kù)(集合,并發(fā),網(wǎng)絡(luò),io/nio)
jre(java運(yùn)行環(huán)境,JVM,類庫(kù))
JDK(java開發(fā)工具,包括JRE,javac,診斷工具)
"一次編譯,到處執(zhí)行"java平臺(tái)依靠JVM和.class字節(jié)碼文件屏蔽不同平臺(tái)軟件硬件差異.認(rèn)為C/C++是面向操作系統(tǒng)的編程,java是面向虛擬機(jī)的編程.
通過(guò)增加一個(gè)間接地中間層來(lái)"解耦"是計(jì)算機(jī)領(lǐng)域常用的一門"藝術(shù)手法".如:虛擬機(jī),操作系統(tǒng),http等.
從你接觸java開發(fā)到現(xiàn)在,你對(duì)java最直觀的印象是什么呢?是他宣傳的"write once ,run anywhere"還是目前看已經(jīng)有些形式主義的語(yǔ)法呢?你對(duì)于java平臺(tái)到底了解到什么程度?請(qǐng)先停下來(lái)總結(jié)思考一下.
今天我要問(wèn)你的問(wèn)題是,談?wù)勀銓?duì)java平臺(tái)的理解?"java是解釋執(zhí)行"這句話正確嗎?
典型回答.
java本身是一種面向?qū)ο蟮恼Z(yǔ)言,最顯著地特征有兩個(gè)方面,一是所謂的"書寫一次,到處運(yùn)行.write once,run anywhere"能夠非常容易的獲得跨平臺(tái)能力,另外就是垃圾回收,java通過(guò)垃圾回收器,回收分配內(nèi)存,大部分情況下,程序員不需要自己操心內(nèi)存的分配和回收.我們?nèi)粘?huì)接觸到JRE或者JDK,jre就是java的運(yùn)行環(huán)境,包括:jvm和java類庫(kù),以及一些模塊等.jdk可以看做jre的一個(gè)超集,提供更多工具,如:編譯器,各種診斷工具.
對(duì)于"java是解釋執(zhí)行"這句話并不準(zhǔn)確,我們開發(fā)的java源代碼,首先通過(guò)javac編譯成字節(jié)碼,然后運(yùn)行時(shí),通過(guò)java虛擬機(jī)(JVM)內(nèi)嵌的解釋器將字節(jié)碼轉(zhuǎn)換成為最終的機(jī)器碼,但是常見的jvm,比如我們大多數(shù)情況下使用的oracleJDK提供的hotspot jvm,都提供了jit編譯器,就是通常所說(shuō)的動(dòng)態(tài)編譯器,jit能夠在運(yùn)行時(shí)將熱點(diǎn)代碼編譯成機(jī)器碼,這種情況下部分熱點(diǎn)代碼就屬于編譯執(zhí)行,而不是解釋執(zhí)行.
考點(diǎn)分析;
其實(shí)這個(gè)問(wèn)題,問(wèn)的有點(diǎn)籠統(tǒng).題目本身是非常開放的,往往考察的是多個(gè)方面,比如,基礎(chǔ)知識(shí)理解是否清晰,是否掌握java平臺(tái)主要模塊和運(yùn)行原理,很多面試者會(huì)在這種問(wèn)題上吃虧,稍微緊張一下,就不知從何說(shuō)起.
對(duì)于這類籠統(tǒng)的問(wèn)題,你需要盡量表現(xiàn)出自己的思維深度和系統(tǒng)化理解,java知識(shí)理解也要全面.避免讓面試官覺(jué)得是"知其然而不知其所",畢竟明白基本組成和機(jī)制,是日常工作中進(jìn)行問(wèn)題診斷或者性能調(diào)優(yōu)等多方面事情的基礎(chǔ),相信沒(méi)人會(huì)不喜歡"熱愛學(xué)習(xí)和思考"的面試者.
即使覺(jué)得自己的回答不是非常完善,也不用擔(dān)心,我個(gè)人覺(jué)得這種籠統(tǒng)的問(wèn)題,回答的片面寫也是正常,大多數(shù)有經(jīng)驗(yàn)的面試官,不會(huì)因?yàn)橐粋€(gè)問(wèn)題輕易對(duì)面試者下結(jié)論.會(huì)盡量引導(dǎo)面試者展示他的真實(shí)水平.這種問(wèn)題是開場(chǎng)熱身,然后根據(jù)你的回答拓展問(wèn)題.
知識(shí)拓展
回歸正題,對(duì)于java平臺(tái)的理解,可以從很多方面簡(jiǎn)明扼要的談,例如;java語(yǔ)言特性包括泛型,lambda等語(yǔ)言特性.基礎(chǔ)類庫(kù),包括集合,io\nio,網(wǎng)絡(luò),并發(fā),安全等基礎(chǔ)類庫(kù).對(duì)于我們?nèi)粘9ぷ鲬?yīng)用較多的類庫(kù),面試前可以系統(tǒng)總結(jié),有助臨場(chǎng)發(fā)揮.
或者談?wù)刯vm的一些基礎(chǔ)概念和機(jī)制,比如java的類加載機(jī)制,常用版本jdk的內(nèi)嵌的class-loader,例如bootstrap,application,和extension? class-loader,類加載大致過(guò)程;加載,驗(yàn)證,連接,初始化(周志明<深入理解java虛擬機(jī)>很好的jvm上手書籍)自定義class-loader等.還有垃圾收集的基本原理,最常見的垃圾收集器,如cms,g1等對(duì)于適用于什么樣的工作負(fù)載也要心理有數(shù),這些都是可以拓展的領(lǐng)域,在后面專欄進(jìn)行更系統(tǒng)介紹.
jdk或java領(lǐng)域的工具,如編譯器,運(yùn)行時(shí)環(huán)境,安全工具,診斷和監(jiān)控工具.這些基本工具是日常日常工作效率的保證.而對(duì)于其他的語(yǔ)言平臺(tái),也是觸類旁通.
回到前面討論的解釋執(zhí)行和編譯執(zhí)行,有些面試官喜歡刨根問(wèn)底.因?yàn)檫@是了解面試者知識(shí)深度的有效方法,我們進(jìn)行深入探討.
我們將java分成:編譯時(shí)期和運(yùn)行時(shí)期.java的編譯不同于c/c++生成可以直接執(zhí)行的機(jī)器碼的編譯.
java源碼編譯生成".class"文件,此文件實(shí)際為字節(jié)碼,并非可以直接執(zhí)行的機(jī)器碼.
java通過(guò)字節(jié)碼和java虛擬機(jī)(JVM)這些跨平臺(tái)的抽象,屏蔽了操作系統(tǒng)和硬件的細(xì)節(jié).這是實(shí)現(xiàn)"一次編譯,到處執(zhí)行"的基礎(chǔ).
在運(yùn)行時(shí),jvm會(huì)通過(guò)類加載器加載字節(jié)碼,解釋或者編譯執(zhí)行..java虛擬機(jī)啟動(dòng)時(shí)可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇.
java虛擬機(jī)啟動(dòng)時(shí),可以指定不同的參數(shù)對(duì)運(yùn)行模式進(jìn)行選擇.
jvm作為一個(gè)強(qiáng)大的平臺(tái).不僅可以運(yùn)行java語(yǔ)言,本質(zhì)上字節(jié)碼都可以運(yùn)行.有大量jvm語(yǔ)言活躍在不同場(chǎng)景.
簡(jiǎn)單介紹java平臺(tái),提綱挈領(lǐng)構(gòu)建整體印象,包括java語(yǔ)言,核心類庫(kù),java虛擬機(jī).等
woj:
"一次編譯,到處執(zhí)行"說(shuō)的是java語(yǔ)言跨平臺(tái)的特性,java的跨平臺(tái)特性與java虛擬機(jī)的存在密不可分.java通過(guò)字節(jié)碼和java虛擬機(jī)(JVM)這些跨平臺(tái)的抽象,屏蔽了操作系統(tǒng)和硬件的細(xì)節(jié).這是實(shí)現(xiàn)"一次編譯,到處執(zhí)行"的基礎(chǔ).不同平臺(tái)的java運(yùn)行環(huán)境不同但是運(yùn)行的字節(jié)碼文件(.class)是相同的.因此才有了java一次編譯到處執(zhí)行的效果,跨平臺(tái)語(yǔ)言不止java一種但是java是比較成熟的一種.java虛擬機(jī)和dos類似,相當(dāng)于一個(gè)供程序運(yùn)行的平臺(tái).
?magict4;
我對(duì)"compile once ,run anywhere"這個(gè)宣傳語(yǔ)提出的背景很感興趣.似乎在暗示c語(yǔ)言的一個(gè)缺陷,對(duì)于每一個(gè)不同的平臺(tái),源代碼都要被再次編譯,但是不同的平臺(tái)可執(zhí)行的機(jī)器碼必然不同,源代碼必然需要依據(jù)不同平臺(tái)再次被編譯.所以這并不是焦點(diǎn).
焦點(diǎn)并不是在編譯上,而是在對(duì)源文件的修改上,c語(yǔ)言經(jīng)常需要調(diào)用系統(tǒng)層面的API.但不同系統(tǒng)的api一般不同,因此為了支持不同的平臺(tái)c語(yǔ)言的源代碼需要根據(jù)不同的平臺(tái)修改源代碼,這是一個(gè)非常大的通電.
三軍;
java特征:
面向?qū)ο?封裝,繼承,多態(tài))
平臺(tái)無(wú)關(guān)性(jvm運(yùn)行,class文件)
語(yǔ)言(泛型,lambda)
類庫(kù)(集合,并發(fā),網(wǎng)絡(luò),io/nio)
jre(java運(yùn)行環(huán)境,JVM,類庫(kù))
JDK(java開發(fā)工具,包括JRE,javac,診斷工具)
java是解析運(yùn)行的嗎?
兩種都有.
1.java源代碼經(jīng)過(guò)javac編譯成.class文件
2..class文件經(jīng)過(guò)jvm編譯或解析運(yùn)行.
①解析:.class文件經(jīng)過(guò)jvm內(nèi)嵌的解析器解析執(zhí)行.
②編譯:存在JIT編譯器(即時(shí)編譯器)把經(jīng)常運(yùn)行的代碼作為熱點(diǎn)代碼,編譯為與本地平臺(tái)相關(guān)的代碼,并進(jìn)行各種層次的優(yōu)化.
③AOT編譯器,java 9提供的直接將所有代碼編譯成機(jī)器碼執(zhí)行.
jerry銀銀
首先,個(gè)人覺(jué)得這個(gè)題目非常抽象和籠統(tǒng),本身沒(méi)有標(biāo)準(zhǔn)答案.但是答案有好壞我的理解:
宏觀層面: