整理Java基礎知識遇到的問題

1.jdk1.5之後的三大版本

  • Java SE(J2SE,Java 2 Platform Standard Edition,標準版)
    JavaSE是Java中的基礎部分,不du過後來的各種框架zhi,各種產品都是基於JavaSE,也就是daoJavaSE是java向上發展的基礎,Java任何高級產品的底層基礎都是JavaSE,所以如果要學習,把它學紮實,牢固是很有必要的
    Java SE 以前稱爲 J2SE。它允許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的 Java 應用程序。Java SE 包含了支持 Java Web 服務開發的類,併爲Java EE和Java ME提供基礎。

  • Java EE(J2EE,Java 2 Platform Enterprise Edition,企業版)
    Java EE 以前稱爲 J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的服務器端Java 應用程序。Java EE 是在 Java SE 的基礎上構建的,它提供 Web 服務、組件模型、管理和通信 API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和 Web2.0應用程序。2018年2月,Eclipse 宣佈正式將 JavaEE 更名爲 JakartaEE

  • Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
    Java ME 以前稱爲 J2ME。Java ME 爲在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環境。Java ME 包括靈活的用戶界面、健壯的安全模型、許多內置的網絡協議以及對可以動態下載的連網和離線應用程序的豐富支持。基於 Java ME 規範的應用程序只需編寫一次,就可以用於許多設備,而且可以利用每個設備的本機功能。

2.JVM、JRE和JDK的關係

  • jdk是Java開發工具包,JDK中包含JRE,在JDK的安裝目錄下有一個名爲jre的目錄,裏面有兩個文件夾bin和lib,在這裏可以認爲bin裏的就是jvm,lib中則是jvm工作所需要的類庫而jvm和 lib和起來就稱爲jre。JDK是整個JAVA的核心,包括了Java運行環境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API 包括rt.jar)。還包含了很多java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。
  • jvm 就是我們常說的java虛擬機,它是整個java實現跨平臺的最核心的部分,所有的java程序會首先被編譯爲.class的類文件,這種類文件可以在虛擬機上執行。也就是說class並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解釋給本地系統執行。只有JVM還不能成class的執行,因爲在解釋class的時候JVM需要調用解釋所需要的類庫lib,而jre包含lib類庫。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。
  • jre是運行基於Java語言編寫的程序所不可缺少的運行環境。也是通過它,Java的開發者才得以將自己開發的程序發佈到用戶手中,讓用戶使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,這些是運行Java程序的必要組件。與大家熟知的JDK不同,JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器),只是針對於使用Java程序的用戶。

如果你需要運行java程序,只需安裝JRE就可以了。如果你需要編寫java程序,需要安裝JDK。

在這裏插入圖片描述

3.java的跨平臺性

java源程序先經過javac編譯器編譯成二進制的.class字節碼文件(java的跨平臺指的就是.class字節碼文件的跨平臺,.class字節碼文件是與平臺無關的),.class文件再運行在jvm上,java解釋器(jvm的一部分)會將其解釋成對應平臺的機器碼執行,所以java所謂的跨平臺就是在不同平臺上安裝了不同的jvm,而在不同平臺上生成的.class文件都是一樣的,而.class文件再由對應平臺的jvm解釋成對應平臺的機器碼執行,我們常說的一次編譯,到處運行指的就是class文件

4.關於java的平臺無關性

平臺無關性,其實對於平臺無關性本人是持懷疑態度的,因爲jvm的存在,使得我們編譯完成後的class文件可以運行在不同的操作系統上,其原理就是隻要你裝有jvm,那麼他就認識這個JAVA字節碼,翻譯成對應平臺的機器碼執行,機器碼再繼續操作硬件,但是java是不能操作硬件的,在併發多線程中就更加明顯了,我們只需要調用API就可以實現對線程的各種操作,而不用去關心具體的操作系統,這給人的感覺就是java實現了不同硬件不同操作系統對線程的統一處理,但是jvm通過調用C++從而達到創建線程,銷燬線程,並且衆多的api都有native關鍵字修飾,這就說明java並不是真正的實現了平臺無關性,舉個例子來說明:java線程都是被映射到原生線程上來實現,java的線程調度最終由操作系統說了算,在我們設置線程優先級對有的操作系統有用,有的操作系統就不管用了,拿Windows來說,windows本身就實現了線程的不同優先級,java通過底層調用C++來設置windows的線程優先級,並且Windows的優先級和jvm的優先級吻合程度高,因此jvm在windows環境下實現線程的優先級就更加明顯,在某些系統中,它的線程優先級就非常少,根本無法對應上java的優先級,所有很可能出現多個優先級對應到同一個操作系統的優先級上的情況了,所以我認爲java的平臺無關性要具體情況具體分析了

5.java爲什麼要有字節碼文件

要非說什麼好處,我感覺就是符合java跨平臺的特性了,還有就是可以通過反編譯來瞭解代碼運行的原理,最重要的一個就是執行效率的問題:按照我的理解,jvm是不能直接執行java文件的,必須要是class文件,java文件經javac編譯後才能被jvm執行(這裏說執行太籠統了,因爲是基礎知識就不需要涉及的太深入,如果有想深入瞭解的可以看我的這篇文章:jvm執行引擎:後端編譯的運行過程和原理),這個編譯過程通常要耗費一定的時間,成爲class文件後就可以立即執行,提高程序執行效率,其實到這裏可以稍微擴展一下:

其實問你什麼字節碼,就相當於校驗你是否懂得什麼是解釋型語言,編譯型語言了。

  • 編譯型語言:用簡單的話來概括就是通過編譯器將代碼編譯完成後生成本地緩存,下次再調用的時候就不需要再次編譯,直接從緩存中獲取,因爲只需編譯一次,以後運行時不需要編譯,所以編譯型語言執行效率高。現有的C、C++、Objective等都屬於編譯型語言。
    • 一次性的編譯成平臺相關的機器語言文件,運行時脫離開發環境,運行效率高,由於這個原因導致這類語言與特定平臺相關,一般無法移植到其他平臺
  • 解釋型語言:解釋型語言不需要事先編譯,其直接將源代碼解釋成機器碼並立即執行,所以只要某一平臺提供了相應的解釋器即可運行該程序。Python等屬於解釋型語言。字節碼也是解釋型的一部分。

那麼java屬於哪一種呢?其實java是一種半編譯半解釋語言:java在JDK1.0時代,程序都是通過解釋器來執行的,所以java在最初的時候運行速度是不如C/C++的,後來虛擬機發展了即時編譯器可以直接生成本地緩存,java程序的執行效率得到大大提升,現在的jvm在執行java代碼的時候既可以通過解釋器執行,也可以通過即時編譯器執行,,但大多數情況下將兩者結合使用,所以將Java稱爲半編譯半解釋型語言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章