Java講義第一章學習筆記
Chapter 1 Java語言概述與開發環境
1.2 java程式執行機制
--1.2.1 高階語言的執行機制
計算機高階語言按程式的執行方式可以分為:編譯型和解釋型
編譯型語言時一次性地編譯成特定平臺上的機器碼,因此編譯可以脫離開發環境獨立執行,而且通常執行效率較高;但因為編譯型語言的程式被編譯成特定平臺上的機器碼,因此編譯生成的可執行程式通常無法移植到其他平臺上執行;
現有的C、C++ .......都屬於編譯型語言。
解釋型語言每次執行都要進行一次編譯,因此解釋型語言的程式執行效率通常較低,而且不能脫離直譯器獨立執行。但解釋型語言有一個優勢:跨平臺比較容易,只需提供特定平臺的直譯器即可,每個特定平臺上的直譯器負責將源程式解釋成特定平臺的機器指令即可。
現有的Javascript、Ruby、Python 等語言都屬於解釋型語言。
--1.2.2 Java程式的執行機制和JVM
Java需要經過編譯和解釋兩個步驟,但編譯步驟不會生成特定平臺的機器碼,而是生成一種與平臺無關的位元組碼(class檔案),這種位元組碼是不可執行的,必須由Java直譯器來解釋執行。
Java原始檔 -------使用javac編譯------->編譯生成.class檔案--------使用java解釋執行-------->特定平臺機器碼
Java語言裡負責解釋執行位元組碼檔案的是Java虛擬機器,即JVM(Java Virtual Machine)。JVM是可執行Java位元組碼檔案的虛擬計算機。所有平臺上的JVM向編譯器提供相同的介面,而編譯器只需要面向虛擬機器,生成虛擬機器能夠理解的程式碼,然後由虛擬機器來解釋執行。在一些虛擬機器的實現中,還會將虛擬機器程式碼轉化成特定系統的機器碼執行,從而提高執行效率。
JVM所包括內容:
- 指令集
- 暫存器
- 類檔案的格式
- 棧
- 垃圾回收堆
- 儲存區
1.3 開發Java的準備
--1.3.1 下載和安裝JDK
相關要點:
-
- 下載JDK網站:http://www.oracle.com/......
- 設定JDK的安裝路徑:D:\Java\jdk-xx.x.x\
安裝完成後,可以在JDK安裝路徑下看到如下的檔案路徑:
-
- bin:該路徑下存放了JDK的各種工具指令,常用的javac、java等命令就放在該路徑下。
- conf:該路徑下存放了JDK的相關配置檔案。
- include:存放一些平臺特定的標頭檔案。
- jmods:該目錄下存放了JDK的各種模組。
- legal:該目錄下包含了JDK各模組的授權文件
- lib:該路徑下存放的是JDK工具的一些補充JAR包。比如src.zip檔案中儲存了Java的原始碼。
--1.3.2 設定PATH環境變數
1.在Windows平臺上設定環境標量
右擊桌面上的“計算機”圖示,出現右鍵選單;單擊“屬性”選單項,系統顯示“控制面板\所有控制面板項\系統”視窗(也可以通過控制面板中的“系統”項來開啟該視窗),單擊該視窗左邊欄中的“高階系統設定”連結,出現“系統屬性”對話方塊,單擊該對話方塊中的“高階”Tab頁,再單擊右下方的環境變數對話方塊,通過該對話方塊可以修改或新增環境變數。如下圖
選擇名為Path的變數,點選編輯,在其後追加環境變數值:D:\Java\jdk-xx.x.x\bin(其中 D:\Java\jdk-xx.x.x\ 是JDK的安裝路徑)。
2.在Linux上設定環境變數
啟動Linux的終端視窗(命令列介面),進入當前使用者的home路徑下,然後在home路徑下輸入如下命令:
ls -a
該命令將列出當前路徑下所有的檔案,包括隱藏檔案,Linux平臺的環境變數是通過 .bash_profile 檔案來設定的。使用無格式的編譯器開啟該檔案,在該檔案的PATH變數後新增:/home/**/Java/jdk-xx.x.x/bin,其中 /home/**/Java/jdk-xx.x.x/ 是JDK的安裝路徑。修改後的PATH變數設定如下:
# 設定PATH環境變數 PATH=.:$PATH:$HOME/bin:/home/**/Java/jdk-xx.x.x/bin
Linux平臺中多個路徑之間以冒號(:)作為分隔符,而$PATH則用於引用原有的PATH變數值。
完成了PATH變數值的設定後,在bash_profile檔案最後新增匯出PATH變數語句,如下所示:
# 匯出PATH環境變數
export PATH
重新登入Linux平臺,或者執行如下命令:
source .bash_profile
使檔案中設定的PATH變數值生效。
1.4 第一個Java程式
--1.4.1 編寫Java原始碼
public class HelloWorld
{
//java程式的入口方法,程式將從這裡開始執行
public static void main(String[] args)
{
//向控制檯列印一條語句
System.out.println("Hello World!");
}
}
--1.4.2 編譯Java程式
通常,總是將生成的文字碼檔案放在當前路徑下,當前路徑可以用點(.)來表示。在命令列視窗進入HelloWorld.java檔案所在路徑,在該路徑下輸入如下命令:
javac -d . HelloWorld.java
執行該命令後,在該路徑下生成一個HelloWorld.class檔案。
補充:
在EditPlus中整合javac命令按如下步驟進行。
- 選擇EditPlus的“工具” -->“配置使用者工具”選單,彈出下圖對話方塊。
- 單擊“組名稱”按鈕來設定工具組的名稱,例如輸入“編譯執行Java”。單擊“新增工具”按鈕,並選擇“程式”選項,然後輸入javac命令的用法和引數,輸入成功後如下圖所示的介面。
3.單擊“確定”按鈕,返回EditPlus主介面。再次選擇EditPlus的“工具”選單,將看到該選單中增加了“編譯Java程式”選單項,單擊該選單項即可編譯EditPlus當前開啟的Java源程式程式碼。
--1.4.3 執行Java程式
通過命令列視窗進入HelloWorld.class所在的路徑,輸入如下的命令:
java HelloWorld
執行上面命令,將會看到如下輸出:
Hello World!
這表明Java程式執行成功。(注:必須嚴格區分大小寫)
補充:
在EditPlus中整合java命令如下圖。
--1.4.4 根據CLASSPATH環境變數定位類
實際上,如果使用1.5及以上版本的JDK,完全可以不用設定CLASSPATH環境變數-------正如上面編譯,執行Java程式所見到的,即使不設定CLASSPATH環境變數,完全可以正常編譯和執行Java程式。
那麼CLASSPATH環境變數的作用是什麼呢?當使用“java Java 類名”命令來執行Java程式時,JRE到哪裡去搜索Java類呢? 答:在當前路徑下搜尋。但1.4以前版本的JDK都沒有設計這個功能,這意味著即使當前路徑包含了HelloWorld.class,並在當前路徑下執行“javac HelloWorld”,系統一樣提示找不到HelloWorld類。
如果使用1.4以前版本的JDK,則需要在CLASSPATH環境變數中新增點(.),用以告訴JRE需要在當前路徑下搜尋Java類。除此之外,編譯和執行Java程式還需要JDK的lib路徑下dt.jar和tool.jar檔案中的Java類,因此還需要把這兩個檔案新增到CLASSPATH環境變數裡。
當然,即使使用JDK 1.5以上版本的JDK,也可以設定CLASSPATH環境變數(通常用於載入第三方類庫),一旦設定了該環境變數,JRE將會按該環境變數指定的路徑來搜尋Java類。這意味著如果CLASSPATH環境變數中不包括點(.),用於代表當前路徑。
如果想在執行Java程式時臨時指定JRE搜尋Java類的路徑,則可以使用-classpath選項(或用-cp選項,-cp是簡寫,作用完全相同),即:
java -classpath dir1;dir2;dir3;...;dirN Java類
-classpath 選項的值可以是一系列的路徑,多個路徑之間在Windows平臺上以分號(;)隔開,在Linux平臺上以冒號(:)隔開。
如果在執行Java程式時指定了-classpath選項的值,JRE將嚴格按-classpath選項所指定的路徑來搜尋Java類,即不會在當前路徑下搜尋Java類,CLASSPATH環境變數所指定的搜尋路徑也不再生效。
如果希望CLASSPATH環境變數指定的搜尋路徑依然有效,而且還會在當前路徑下搜尋Java類,則可以按如下格式來執行Java程式。
java -classpath %CLASSPATH%; . ;dir1;dir2;dir3;...;dirN Java類
上面命令通過%CLASSPATH%來引用CLASSPATH環境變數的值,並在-classpath選項的值裡添加了一個點,強制JRE在當前路徑下搜尋Java類。
1.5 Java程式的基本規則
--1.5.1 Java程式的組織形式
Java程式是一種純粹的面向物件的程式設計語言,因此Java程式必須以類(class)的形式存在,類(class)是Java程式的最小程式單元。
最簡單的Java程式:
class Test
{
}
這個程式定義了一個空類。使用javac命令來編譯這個程式,不會出現編譯錯誤。但如果使用java命令來執行上面的Test類則會出現如下錯誤:
錯誤:在類 Test 中找不到 main 方法,請用 main 方法定義為:public static void main(String[] args)
上面的錯誤提示僅僅表明:這個類不能被java命令解釋執行,並不表示這個類是錯誤的。實際上,Java直譯器規定:如需某個類能被直譯器直接解釋執行,則這個類裡必須包含 main 方法,而且 main 方法必須使用 public static 修飾 ,必須使用 void 宣告該方法的返回值 ,且 main 方法的形參必須是字串陣列型別(String[] args 是字串陣列形式)。因此, main 是Java程式的入口。
--1.5.2 Java原始檔的命名規則
- Java程式原始檔的副檔名必須是 .java,不能是其他副檔名。
- 在通常情況下,Java程式原始檔的主檔名可以是任意的。但有一種情況例外:如果Java程式原始碼裡定義了一個public類,則該原始檔的主檔名必須與該 public 類的類名相同。因此,一個Java原始檔裡最多隻能定一個 public 類。
一個Java源程式可以包含多個類定義,各個類之間完全獨立,只是定義在同一個原始檔中而已。如下:
class Dog
{
}
class Cat
{
}
class bird
{
}
上面程式使用同一個原始檔定義了3個獨立的類:Dog,Cat,Bird。使用 javac 命令編譯該Java程式,將會生成3個 .class 檔案,每個類對應一個 .class 檔案。
命名幾點建議:
- 一個Java原始檔通常只定義一個類,不同的類使用不同的原始檔定義。
- 讓Java原始檔的主檔名與該原始檔中定義的 public 類同名。
補充:如何關閉隱藏副檔名功能(Windows)
https://jingyan.baidu.com/album/f00622282564bdfbd3f0c827.html?picindex=1
1.6 互動式工具:jshell
從JDK 9 開始,JDK內建了一個強大的互動式工具:jshell。它是一個REPL(Read-Eval_Print Loop)工具,該工具是一個互動式命令列介面,可用於執行Java語言的變數宣告、語句和表示式,而且可以立即看到執行結果。因此,可以使用該工具來測試Java的新的API。
啟動 jshell 只需在命令列視窗輸入 jshell 命令,即可進入 jshell 互動模式。
常用指令:
-
- /help : 常看幫助資訊。
- /exit : 退出。
- /list : 列出使用者輸入的所有原始碼。
- /edit : 編輯使用者輸入的第幾條原始碼。
- /drop : 刪除使用者輸入的第幾條原始碼。
- /save : 儲存使用者輸入的原始碼。
- /vars : 列出使用者定義的所有變數。
- /methods : 列出使用者定義的全部方法。
- /type : 列出使用者定義的全部型別。