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