由於下學期要學習JavaEE所以打算將JavaSE的知識再重新學習一遍,打好基礎的同時也希望自己有新的收穫和更深刻的理解。 這次複習主要是參考 "廖雪峰老師的java教程" ,每學習完一章對其中一些要點進行總結和概括。 簡介 Java最早是由SUN公司(已被Oracle收購)的 "詹姆斯·高斯林" ...
由於下學期要學習JavaEE所以打算將JavaSE的知識再重新學習一遍,打好基礎的同時也希望自己有新的收穫和更深刻的理解。
這次複習主要是參考廖雪峰老師的java教程,每學習完一章對其中一些要點進行總結和概括。
簡介
Java最早是由SUN公司(已被Oracle收購)的詹姆斯·高斯林(高司令,人稱Java之父)在上個世紀90年代初開發的一種編程語言,最初被命名為Oak,目標是針對小型家電設備的嵌入式應用,結果市場沒啥反響。誰料到互聯網的崛起,讓Oak重新煥發了生機,於是SUN公司改造了Oak,在1995年以Java的名稱正式發佈,原因是Oak已經被人註冊了,因此SUN註冊了Java這個商標。隨著互聯網的高速發展,Java逐漸成為最重要的網路編程語言。
Java介於編譯型語言和解釋型語言之間。編譯型語言如C、C++,代碼是直接編譯成機器碼執行,但是不同的平臺(x86、ARM等)CPU的指令集不同,因此,需要編譯出每一種平臺的對應機器碼。解釋型語言如Python、Ruby沒有這個問題,可以由解釋器直接載入源碼然後運行,代價是運行效率太低。而Java是將代碼編譯成一種“位元組碼”,它類似於抽象的CPU指令,然後,針對不同平臺編寫虛擬機,不同平臺的虛擬機負責載入位元組碼並執行,這樣就實現了“一次編寫,到處運行”的效果。當然,這是針對Java開發者而言。對於虛擬機,需要為每個平臺分別開發。為了保證不同平臺、不同公司開發的虛擬機都能正確執行Java位元組碼,SUN公司制定了一系列的Java虛擬機規範。從實踐的角度看,JVM的相容性做得非常好,低版本的Java位元組碼完全可以正常運行在高版本的JVM上。
之前只知道java是一種可以跨平臺運行的語言,但是並不知道其中的原因,現在明白了java代碼通過本地編譯器編譯形成“java位元組碼”,而“java位元組碼”可以在任何平臺的虛擬機(JVM)執行,這樣就實現了“一次編寫,到處執行”。
隨著Java的發展,SUN給Java又分出了三個不同版本:
- Java SE:Standard Edition (Java SE就是標準版,包含標準的JVM和標準庫,JAVA平臺的核心)
- Java EE:Enterprise Edition (Java EE是企業版,它只是在Java SE的基礎上加上了大量的API和庫,以便方便開發Web應用、資料庫、消息服務等,Java EE的應用使用的虛擬機和Java SE完全相同。)
- Java ME:Micro Edition (Java ME就和Java SE不同,它是一個針對嵌入式設備的“瘦身版”,Java SE的標準庫無法在Java ME上使用,Java ME的虛擬機也是“瘦身版”。)
名詞解釋
- JDK:Java Development Kit
JRE:Java Runtime Environment
簡單地說,JRE就是運行Java位元組碼的虛擬機。但是,如果只有Java源碼,要編譯成Java位元組碼,就需要JDK,因為JDK除了包含JRE,還提供了編譯器、調試器等開發工具。
- JSR規範:Java Specification Request
JCP組織:Java Community Process
為了保證Java語言的規範性,SUN公司搞了一個JSR規範,凡是想給Java平臺加一個功能,比如說訪問資料庫的功能,大家要先創建一個JSR規範,定義好介面,這樣,各個資料庫廠商都按照規範寫出Java驅動程式,開發者就不用擔心自己寫的資料庫代碼在MySQL上能跑,卻不能跑在PostgreSQL上。
所以JSR是一系列的規範,從JVM的記憶體模型到Web程式介面,全部都標準化了。而負責審核JSR的組織就是JCP。
一個JSR規範發佈時,為了讓大家有個參考,還要同時發佈一個“參考實現”,以及一個“相容性測試套件”:
- RI:Reference Implementation
- TCK:Technology Compatibility Kit
如何運行Java程式
Java源碼本質上是一個文本文件,我們需要先用javac把Hello.java編譯成位元組碼文件Hello.class,然後,用java命令執行這個位元組碼文件:
┌───────┐
│ Hello.java │<─── source code
└───────┘
│ compile
▼
┌───────┐
│ Hello.class │<─── byte code
└───────┘
│ execute
▼
┌────────┐
│ Run on JVM │
└────────┘
因此,可執行文件javac是編譯器,而可執行文件java就是虛擬機。