第一章【安裝、配置、編寫、理解】
一、JDK
1、相關名詞
SDK:軟體開發包
JDK:java程式開發工具包
JRE:java程式執行環境
API:應用程式程式設計介面
API Documentation:API說明文件
2、jdk安裝
3、oracle官方文件中提供的JDK結構圖:
4、JDK目錄
sun公司程式設計師--編寫基礎的程式碼-->*.java --壓縮-- >src.zip --編譯--> *.class --歸檔-->rt.jar
二、物件導向
1、OOP理念
物件導向程式設計(Object-Oriented Programming,OOP)
物件導向的特徵:抽象、封裝、繼承、多型。
- 封裝是一種物件功能內聚的表現形式,使模組之間耦合度變低,更具有維護性;
- 繼承使子類能夠繼承父類,獲得父類的部分屬性和行為,使模組更有複用性;
- 多型使模組在複用性基礎上更加有擴充套件性,使執行期更有想象空間
- 抽象是物件導向思想最基礎的能力之一,正確而嚴謹的業務抽象和建模分析能力是後續的封裝、繼承、多型的基礎,是軟體大廈的基石。
Java 之父 Gosling 設計的 Object 類,是任何類的預設父類,是對萬事萬物的抽象。
三、JVM
四、垃圾回收器
java程式碼中,開闢要使用的記憶體空間,使用new關鍵字即可完成,使用完之後,對記憶體的釋放,在JVM中,由垃圾回收器(Garbage Collection,GC)來完成。
五、位元組碼驗證
一個class檔案被載入到JVM記憶體之後,首先要經過位元組碼驗證,主要包含:
-
檢查當前class檔案的版本和JVM的版本是否相容
-
檢查當前程式碼是會破壞系統的完整性
-
檢查當前程式碼是否有棧溢位的情況
-
檢查當前程式碼中的引數型別是否正確
-
檢查當前程式碼中的型別轉換操作是否正確
六、編寫Java程式
1、書寫Java檔案的過程
vim Hello.java
2、程式中出現主方法
3、將Java檔案編譯成class檔案
javac Hello.java
4、執行程式
java Hello
引數:
-cp:在【本次命令】中【臨時指定】類載入器去哪個位置載入我們需要執行的程式
java -cp src Hello
-verbose:將JVM啟動執行的時候載入的資訊輸出出來
java -verbose Hello
java -verbose Hello > a.txt
-d:指定放置生成的類檔案的位置
javac -d bin Hello.java
【注意】在書寫Java檔案的時候的注意事項
1、原始檔字尾名必須為.java
2、一個java原始檔中可以包含很多個Java類,但是有且只有一個使用public修飾的類,並且使用public修飾的類的類名和原始檔名保持一致。
3、一個類要想執行,需要在這個類中出現主函式,否則只能透過呼叫的方式執行main方法,與類是否使用public沒有任何關係,只要想執行就新增public。
七、package
1、定義包結構,將編譯過後的class檔案需要放在指定的包結構下面
2、Java中定義的包結構實際上在計算機上是以資料夾的形式存在
3、package定義是可添也可不添。包名.類名
4、如果要新增包結構必須放在所有程式的第一行
5、包結構允許出現多層,使用.分割
package com.briup.day2;
public class Hello{}
類的全限定名:
com.briup.day2.Hello
6、自動生成包結構
javac -d . Dog.java
7、其他路徑下執行程式
java -cp src com.sxu.day2.Dog
8、在src
下建立bin
目錄,將編輯執行的class檔案放在bin裡面
八、jar
1、使用jar命令將位元組碼檔案壓縮成.jar
jar -cvf 打包名.jar *.class
jar -cvf Hello.jar Hello.class
jar -cvf Dog.jar com/sxu/day2/Dog.class
jar -cvf hello.jar -C bin .
2、 修改打包的jar包裡面的檔案META-INF的MANINFEST.MF,新增以下main方法所在的類
Main-Class: Hello
【注意:冒號後面有空格】
`Main-Class: com.sxu.day2.Dog`
或者vim Hello.jar
點進去MANINFEST.MF,新增 Main-Class: Hello
儲存重新壓縮,此時jar可用
3、執行壓縮檔案
java -jar Hello.jar
java -jar Dog.jar
完整版
-
在java檔案下建立src、bin目錄
mkdir src bin
-
進入src資料夾,編寫Hello.java檔案
vim Hello.java
編寫程式碼,包含package
1 package com.sxu.day2; 2 3 public class Hello{ 4 public static void main(String[] args){ 5 System.out.println("hello world!"); 6 } 7 }
-
然後將Hello.java檔案編譯成Hello.class檔案並儲存在bin目錄下
javac -d ../bin Hello.java
-
返回上級目錄,執行程式
cd ..
java -cp bin com.sxu.day2.Hello
-
把當前目錄下的bin資料夾裡面的所有檔案打到jar包中,但是【不包含】bin目錄本身
jar -cvf hello.jar -C bin .
-
此時jar是一個普通的jar,不能直接java -jar的方式進行執行
【直接執行報錯:hello.jar中沒有主清單屬性】
原因是因為沒有在jar中指定哪一個類中有程式的入口,需要修改jar中的配置
方式一
儲存,然後更新壓縮包
方式二:
vim hello.jar
游標移動到MANINFEST.MF位置,回車,然後
i
輸入,ESC
-->:wq!
,再次:q
退出 -
執行hello.jar包
java -jar hello.jar
九、import
1、一個類去引入其他類
若要引用的類在同包或java.lang包下面,那麼類是可以直接使用;
若要使用的類不在同包也不再java.lang包下面,那麼需要import導包。
例子1:同包
vim src/Stu.java 【含主方法,呼叫Tea】
vim src/Tea.java
javac -d bin src/Tea.java
javac -cp bin -d bin src/Stu.java
java -cp bin com.sxu.day3.Stu
例子2:不同包
vim src/Doc.java
package com.sxu.day3.test;
import com.sxu.day3.test.Doc;
直接將src下所有的java檔案編譯
javac -d bin src/*.java
十、類載入
- 啟動類載入器 bootstrapClassLoader,非java語言實現 jre/lib/rt.jar
- 擴充套件類載入器 ExtClassLoader,java語言實現,是ClassLoader型別的物件 jre/lib/ext/xxx.jar
- 應用類載入器 AppClassLoader,java語言實現,是ClassLoader型別的物件 CLASSPATH指定
十一、雙親委託機制
例子:現在要載入Hello.class檔案中的類
-
首先載入任務就交給了AppClassLoader
-
然後AppClassLoader把這個任務委託給自己的父載入器,也就是ExtClassLoader
-
然後ExtClassLoader把這個任務委託給自己的父載入器,也就是bootstrapClassLoader
-
然後bootstrapClassLoader就嘗試去載入Hello這個類,但是在指定路徑下並沒有找到
-
然後任務又交回給了ExtClassLoader,ExtClassLoader嘗試載入Hello這個類,但是在指定路徑中沒找到
-
然後任務又交回給了AppClassLoader
-
最後AppClassLoader從CLASSPATH中指定的路徑裡面找到並載入了這個Hello類,完成類載入的過程
把hello.jar移到/opt/jdk1.8.0_171/jre/lib/ext/
sudo mv hello.jar /opt/jdk1.8.0_171/jre/lib/ext/
在任意路徑都可以執行Hello這個類
java com.sxu.day2.Hello