1. 程式人生 > 其它 >01-JavaSE入門、JDK的下載與安裝、第一個Java程式、Java程式的編譯與執行

01-JavaSE入門、JDK的下載與安裝、第一個Java程式、Java程式的編譯與執行

01-JavaSE入門、JDK的下載與安裝、第一個Java程式、Java程式的編譯與執行

Java的發展歷史

Java是一種面向物件的程式設計語言,由Sun Microsystems公司的James Gosling等人於20世紀90年代初開發。它最初被命名為Oak,用來開發消費類電子產品,解決諸如電話、電視機等家用電器的控制和通訊問題。後來隨著網際網路的發展,Sun看到了Oak在計算機網路上的廣闊應用前景,於是改造了Oak,在1995年5月正式命名為"Java",變化歷程如下圖1.1和1.2所示。

Java語言的版本

JavaSE

   Java SE(Java Platform,Standard Edition)。Java SE 以前稱為J2SE。它允許開發和部署在

桌面伺服器、嵌入式環境和實時環境中使用的Java 應用程式。Java SE 包含了支援Java Web 服務開發的類,併為Java Platform,Enterprise Edition(Java EE)提供基礎。
例子:類似QQ、掃雷、飛秋、凌波這樣子的桌面應用。

Java EE

   Java EE(Java Platform,Enterprise Edition)。這個版本以前稱為J2EE。企業版本幫助開發和部署可移植、健壯、可伸縮且安全的伺服器端 Java 應用程式。Java EE 是在Java SE 的基礎上構建的,它提供Web 服務、元件模型、管理和通訊API,可以用來實現企業級的面向服務

體系結構(service-oriented architecture,SOA)和Web 2.0 應用程式。

Java ME

   Java ME(Java Platform,Micro Edition)。這個版本以前稱為J2ME,也叫K-JAVA。Java ME 為在移動裝置和嵌入式裝置(比如手機、PDA、電視機頂盒和印表機)上執行的應用程式提供一個健壯且靈活的環境。Java ME 包括靈活的使用者介面、健壯的安全模型、許多內建的網路協議以及對可以動態下載的連網和離線應用程式的豐富支援。基於Java ME 規範的應用程式只需編寫一次,就可以用於許多裝置,而且可以利用每個裝置的本機功能。

Java的特點

1.跨平臺

何謂平臺:即一套特定的硬體再加上執行其上的作業系統,即硬體+軟體。

Java編譯器將Java源程式編譯成一種與體系結構無關的中間檔案格式,稱為位元組碼。只要有Java執行系統的機器都能執行這種中間程式碼。從而使同一版本的應用程式可以執行在不同的平臺上。

怎樣理解平臺無關性呢?JVM (java Virtual Machine)起到了主要作用。JVM是執行在平臺之上的程式,它能夠虛擬出一臺目標機,所有位元組碼就是在虛擬出的目標機上執行。

110是Windows上的指令。

101是linux上的指令。

Java跨平臺

"write once run anywhere"

Java的跨平臺是相對於其他程式語言而言的,通過Java語言編寫的應用程式在不同的系統平臺上都可以執行。一般的高階語言如果要在不同的平臺上執行,至少需要編譯成不同的目的碼。在windows編譯的c語言程式,在linux下是不能執行的,想要在linux下執行,那麼就需要將c語言程式原始碼在linux平臺上重新編譯成linux平臺的目的碼才行。當然在linux下編譯的c語言程式在windows下也是不能執行的。而Java語言在不同平臺上執行時不需要重新編譯。

Java跨平臺的原理:Java的跨平臺是通過Java虛擬機器(JVM)來實現的。

2.半編譯半解釋

源程式先編譯成位元組碼,Java直譯器(執行系統)能直接對Java位元組碼進行解釋執行。連結程式通常比編譯程式所需資源少,Java的編譯和解釋執行過程如下圖1.4所示。

3.簡單

Java是個精簡的系統,無需強大的硬體環境便可以很好地執行。Java的風格和語法類似於C++,因此,C++程式設計師可以很快就掌握Java程式設計技術。Java摒棄了C++中容易引發程式錯誤的地方,如多重繼承、運算子過載、指標和記憶體管理等,Java語言具有支援多執行緒、自動垃圾收集和採用引用等特性。Java提供了豐富的類庫,方便使用者迅速掌握Java。

4.面向物件

物件可以是人們研究的任何實體,小到一個原子大到整個宇宙,均可看作物件,它不僅能表示具體的事物,還能表示抽象的規則、概念等。物件之間通過訊息相互作用,用公式表示,面向物件程式語言可以表示為:程式=物件+訊息。現實世界中的物件均有屬性和行為,對映到計算機程式上,屬性就表示物件的資料(用來表示物件的狀態),行為就表示物件的方法(用來處理資料或同外界互動)。

所有面向物件程式語言都支援三個概念:封裝、繼承和多型,Java也不例外。

面向物件可以說是Java最基本的特性。Java語言的設計完全是面向物件的,它不支援類似C語言那樣的面向過程的程式設計技術。所有的Java程式和applet均是物件,Java支援靜態和動態風格的程式碼繼承及重用。

5.分散式

Java包括一個支援HTTP和FTP等基於TCP/IP協議的子庫。因此,Java應用程式可憑藉URL開啟並訪問網路上的物件,就像訪問本地檔案一樣簡單方便。Java的分佈性為實現在分佈環境尤其是Internet下實現動態內容提供了技術途徑。

6.健壯

Java提供了自動垃圾收集機制來進行記憶體管理,並檢測程式對記憶體的訪問,確定合法並不會引起任何問題後,才允許訪問。

Java還提供了異常處理機制用來檢查編譯及執行時可能出現的問題,Java在編譯和執行程式時要對可能出現的異常進行檢查;同時,Java在編譯時還可捕獲型別宣告中的許多常見錯誤,幫助程式設計師消除錯誤,防止系統崩潰。

7、安全

作為網路語言,安全是非常重要的。Java的安全性可從兩個方面得到保證。一方面,在Java語言裡,像指標和釋放記憶體等C++功能被刪除,避免了非法記憶體操作。另一方面,當Java用來建立瀏覽器時,語言功能和一類瀏覽器本身提供的功能結合起來,使它更安全。Java語言在你的機器上執行前,要經過很多次的測試。它經過程式碼校驗,檢查程式碼段的格式,檢測指標操作,試圖改變一個物件的型別。另外,Java擁有多個層次的互鎖保護措施,能有效地防止病毒的入侵和破壞行為的發生。Java不支援指標,避免了由於指標操作所引起的錯誤和非法入侵。同時,Java在執行應用程式時,嚴格檢查其訪問資料的許可權,保證資料的可靠性。

8.多執行緒

執行緒有時也稱小程序,是一個大程序裡分出來的小的獨立執行的基本單位。Java提供的多執行緒功能使得在一個程式裡可同時執行多個小任務,即同時進行不同的操作或處理不同的事件。多執行緒帶來的更大的好處是具有更好的網上互動效能和實時控制性能,尤其是實現多媒體功能。

Java開發環境的搭建

Java執行環境就是JRE (Java Runtime Environment),是由Sun所研發的,是一個軟體, JRE可以讓計算機系統執行Java應用程式,它是執行JAVA程式所必須的環境的集合,JRE的內部有一個JAVA虛擬機器(Java Virtual Machine,JVM)以及一些標準的類庫(Class Library),如果你只需要執行Java程式,下載並安裝它即可。

如果你要自行開發 Java軟體,請下載JDK。在JDK中附帶有JRE。最新版本下載地址http://www.oracle.com/technetwork/java/javase/downloads/index.html。

java的環境的搭建:

jre: java執行環境。 jre = java虛擬機器 + 核心類庫(輔助java虛擬機器執行的檔案)

jdk: java開發工具集 jdk = jre + java開發工具。

java開發工具,例如,javac編譯工具,java直譯器執行工具。

如果只是軟體使用者,那麼安裝jre即可,提供執行環境。

如果是軟體開發者,那麼就需要安裝jdk。因為需要開發工具。

JRE Java Runtime Environment Java執行環境。包括Java虛擬機器(JVM Java Virtual Machine)和Java程式所需的核心類庫等,如果想要執行一個開發好的Java程式,計算機中只需要安裝JRE即可。

JDK 是整個Java的核心,包括了Java執行環境、Java工具和Java基礎類庫。

第一個Java程式

Java程式執行的原理

Java程式執行在Java虛擬機器上,Java虛擬機器就是指JVM (Java Virtual Machine) ,這是一個虛構出來的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。Java虛擬機器有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統,編輯、編譯及執行Java程式的過程如圖1.13所示。

圖1.13編輯、編譯及執行Java程式的過程

一個執行時的Java虛擬機器例項的天職就是:負責執行一個Java程式。Java虛擬機器的主要任務是裝載class檔案並且解釋執行其中的位元組碼。當啟動一個Java程式時,一個虛擬機器例項也就誕生了。當該程式關閉退出,這個虛擬機器例項也就隨之消亡。如果同一臺計算機上同時執行三個Java程式,將得到三個Java虛擬機器例項。每個Java程式都運行於它自己的Java虛擬機器例項中,如下圖1.14所示。

圖 執行時過程

編譯原始檔:java原始碼被java編譯器編譯(Compile)。如果這時產生錯誤,我們稱為編譯錯誤。如果沒有錯誤,則生成位元組碼(byte code)。

執行位元組碼:這裡,java位元組碼被裝載到java虛擬機器中,解釋成原生代碼再執行。如果此時產生錯誤,我們稱之為執行時錯誤(Runtime)。

註釋的使用

Java 的註釋是被Javac忽略的部分,Java中的註釋包含下面三種。

1.單行註釋

// 單行註釋

2.多行註釋

/* 多行註釋 */

3.文件註釋

/** 文件註釋 */

Java的註釋如下圖1.17所示。

Java中的修飾符如下圖1.19所示,其中public用來修飾類,也可以修飾方法,static用來修飾main方法,void是main方法的返回值型別,表示此方法沒有返回值。

類和主方法

Java中的類和主方法的結構圖下圖1.20所示,主方法在類的內部,類裡包含方法。


Java跨平臺性是通過JVM(Java虛擬機器)來實現的。

JVM是不具有跨平臺性的,針對不同的平臺分別設計了對應的JVM。通過不同平臺的JVM來實現了Java程式的跨平臺性。也就是通過JVM的不跨平臺性來支援Java程式的跨平臺性。

Java程式碼的執行:

編譯:Java原始碼通過javac命令編譯成class位元組碼檔案。

解釋執行:class位元組碼檔案通過java命令解釋執行。

Java原始碼->編譯->class位元組碼檔案->直譯器解釋執行

注意,class位元組碼檔案是與特定硬體平臺無關的中間程式碼,從而實現了在不同平臺上的JVM上的解釋執行,實現跨平臺性。

Java位元組碼的兩種執行方式:

即時編譯:直譯器(JVM)將位元組碼編譯成對應硬體平臺的機器碼(二進位制指令),然後再在該平臺上直接執行該機器碼,速度快,效率高。

解釋執行:直譯器每次解釋並執行位元組碼中的一小段程式碼,從而實現位元組碼的執行。

Java程式執行與C/C++程式執行對比:

JVM相當於80x86計算機。

JVM中的Java直譯器相當於80x86 CPU。

在80x86 CPU上執行的是C/C++原始碼編譯之後的機器碼,在JVM直譯器上執行的是Java原始碼編譯之後的位元組碼。

當前不是所有平臺都提供了JVM的,因此,Java程式碼只能在已經實現了JVM軟體的並且安裝了JVM軟體的平臺上執行。

javac命令就是java編譯器。

java命令就是java直譯器。利用直譯器去裝載位元組碼的時候,會自動的啟動jvm虛擬機器。使位元組碼在jvm內部執行。

Java原始檔編譯過程:

Java應用程式的開發週期包括編譯、下載、解釋和執行幾個部分。Java編譯程式將Java源程式翻譯為JVM可執行程式碼—位元組碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個物件的程式碼時,該程式碼是為在某一特定硬體平臺執行而產生的。因此,在編譯過程中,編譯程式通過查表將所有對符號的引用轉換為特定的記憶體偏移量,以保證程式執行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程式執行過程中的記憶體佈局,而是將這些符號引用資訊保留在位元組碼中,由直譯器在執行過程中建立記憶體佈局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。

直譯器解釋執行分為3步:

程式碼的裝入、程式碼的校驗、程式碼的執行。

執行JVM位元組碼的工作是由直譯器來完成的。解釋執行過程分三步進行:程式碼的裝入、程式碼的校驗和程式碼的執行。裝入程式碼的工作由“類裝載器”(class loader)完成。類裝載器負責裝入執行一個程式需要的所有程式碼,這也包括程式程式碼中的類所繼承的類和被其呼叫的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其它類。在本臺計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的執行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了執行程式需要的所有類後,直譯器便可確定整個可執行程式的記憶體佈局。直譯器為符號引用同特定的地址空間建立對應關係及查詢表。通過在這一階段確定程式碼的記憶體佈局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了程式碼對地址的非法訪問。

隨後,被裝入的程式碼由位元組碼校驗器進行檢查。校驗器可發現運算元棧溢位,非法資料型別轉換等多種錯誤。通過校驗後,程式碼便開始執行了。

Java基礎類庫,都內建在jdk中。

demo目錄是提供的一些例子程式。

lib目錄就是提供的一些基礎類庫。

jre目錄就是執行時環境。

linux/unix下,換行是一個字元來表示的,ascII表示就是10。

windows下,換行是兩個字元來表示,實際是回車+換行,ascII表示就是13和10。來表示一個回車+換行。

Java中所有功能都需要通過類來完成,也就是說Java中最小組織單位就是類。

JDK、JRE、JVM關係示意圖

JRE (Java Runtime Environment) :是Java程式的執行時環境,包含 JVM 和執行時所需要的 核心類庫 。
JDK (Java Development Kit):是Java程式開發工具包,包含 JRE 和開發人員使用的工具。
我們想要執行一個已有的Java程式,那麼只需安裝 JRE 即可。
我們想要開發一個全新的Java程式,那麼必須安裝 JDK 。

三者關係: JDK > JRE > JVM

Java程式的執行過程

所有的Java程式碼,其後綴都是以java結尾,Java程式的執行過程分為兩步:

\1. 編譯

\2. 執行

Class檔案是位元組碼檔案,程式最終執行的就是這個位元組碼(bytecode)檔案。

編譯命令:java Hello.java

執行命令:java Hello(注意,Test後面沒有.class)

注意,載入的是類,而不是class位元組碼檔案。執行的流程就是首先根據java命令後面的要載入的類的名字來找到對應的名字的class檔案,然後JVM會將class檔案載入到記憶體的方法區中,然後將class檔案解開,就會找到裡面對應的那個類,然後就可以載入這個類進行執行。

Java是跨平臺的語言,真正執行的不是二進位制程式碼,而是位元組碼。

JVM(Java Virtual Machine,Java虛擬機器)

Java是跨平臺的,而JVM不是跨平臺的(JVM是由C語言編寫的)

Java之所以能夠做到跨平臺,本質原因在於JVM不是跨平臺的。