1.安裝、配置、編寫、理解

可乐爱兑姜汁發表於2024-04-14

第一章【安裝、配置、編寫、理解】

一、JDK

1、相關名詞

SDK:軟體開發包

JDK:java程式開發工具包

JRE:java程式執行環境

API:應用程式程式設計介面

API Documentation:API說明文件

2、jdk安裝

3、oracle官方文件中提供的JDK結構圖:

image-20210111140532340

4、JDK目錄

image-20210111140646901

sun公司程式設計師--編寫基礎的程式碼-->*.java --壓縮-- >src.zip --編譯--> *.class --歸檔-->rt.jar

二、物件導向

1、OOP理念

物件導向程式設計(Object-Oriented Programming,OOP)

物件導向的特徵:抽象、封裝、繼承、多型。

  • 封裝是一種物件功能內聚的表現形式,使模組之間耦合度變低,更具有維護性;
  • 繼承使子類能夠繼承父類,獲得父類的部分屬性和行為,使模組更有複用性;
  • 多型使模組在複用性基礎上更加有擴充套件性,使執行期更有想象空間
  • 抽象是物件導向思想最基礎的能力之一,正確而嚴謹的業務抽象和建模分析能力是後續的封裝、繼承、多型的基礎,是軟體大廈的基石。

Java 之父 Gosling 設計的 Object 類,是任何類的預設父類,是對萬事萬物的抽象。

三、JVM

image-20210111141309832

四、垃圾回收器

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

完整版

  1. 在java檔案下建立src、bin目錄

    mkdir src bin

  2. 進入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 }
    
  3. 然後將Hello.java檔案編譯成Hello.class檔案並儲存在bin目錄下

    javac -d ../bin Hello.java

  4. 返回上級目錄,執行程式

    cd ..

    java -cp bin com.sxu.day2.Hello

  5. 把當前目錄下的bin資料夾裡面的所有檔案打到jar包中,但是【不包含】bin目錄本身

    jar -cvf hello.jar -C bin .

  6. 此時jar是一個普通的jar,不能直接java -jar的方式進行執行

    【直接執行報錯:hello.jar中沒有主清單屬性】

    原因是因為沒有在jar中指定哪一個類中有程式的入口,需要修改jar中的配置

    方式一

    image-20210111162213275 image-20210111162338827 image-20210111162544672

    儲存,然後更新壓縮包

    image-20210111162634643

    方式二:

    vim hello.jar

    image-20210111170636408

    游標移動到MANINFEST.MF位置,回車,然後i輸入,ESC-->:wq!,再次:q退出

    image-20210111170907117

  7. 執行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

相關文章