java面試題(楊曉峰)---第一講談談你對java平臺的理解

本人總結:

面向對象(封裝,繼承,多態)

平臺無關性(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銀銀

首先,個人覺得這個題目非常抽象和籠統,本身沒有標準答案.但是答案有好壞我的理解:

宏觀層面:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,141評論 0 62
  • 每個使用Java的開發者都知道Java字節碼是在JRE中運行(JRE: Java 運行時環境)。JVM則是JRE中...
    燕京博士閱讀 1,438評論 0 6
  • Vincent_Hou閱讀 165評論 0 0
  • 1 2006年。初次見面的王塵與李暖的兩人。是非常狗血的。 同學校不同級應該是沒有多大交流的。而且還是小學。 ...
    祈9閱讀 457評論 1 1