天天看點

2020/2/25學習筆記-day05java-day5早上下午

java-day5

目錄

java-day5

早上

第一節課

通過對API内的部分代碼反編譯檢視

第二節課

回顧雙親委托内容

運作jar包的方式總結

第三節課

自定義類加載器

下午

JAVA是什麼?

為什麼會發明JAVA?

編譯語言

垃圾回收器

1、java不需要自己配置設定記憶體

2、new關鍵字建立對象使用了記憶體,最終要把記憶體釋放

3、垃圾回收器是什麼?

4、我們是否能控制垃圾回收器去回收記憶體垃圾?

位元組碼驗證

位元組碼驗證規則

解釋執行

JIT(Just InTime)即時編譯

早上

第一節課

通過對API内的部分代碼反編譯檢視

2020/2/25學習筆記-day05java-day5早上下午

第二節課

回顧雙親委托内容

2020/2/25學習筆記-day05java-day5早上下午

運作jar包的方式總結

person.jar是一個可執行jar包,裡面有com.xxx.Person.class
同時Person類運作需要依賴hello.jar和commons.jar中的類
這時候有兩種方式運作:
1、修改MF檔案(配置Class-Path:.....)
2、以運作java類的方式去運作person.jar中的Person類
MF檔案不需要配置,隻需在外面配置系統環境變量
set classpth=jar/person.jar;jar/hello.jar;jar/c.jar;
           

将三個包都放在ext檔案下,通過雙親委托機制運作

第三節課

自定義類加載器

調用API流程

ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(appClassLoader); 
//[email protected]
​
ClassLoader extClassLoader = appClassLoader.getParent();
System.out.println(extClassLoader); 
//[email protected]
​
ClassLoader bootClassLoader = extClassLoader.getParent();
System.out.println(bootClassLoader);
//null
//注意:啟動類加載在java中無法表示,因為它不是java語言實作的。所有這裡輸出null
           

下午

variables變量
           

JAVA是什麼?

從jdk角度想,jdk提供什麼?jdk能幹嘛?
1、程式設計語言
2、開發環境 
3、運作環境
4、部署環境
           
2020/2/25學習筆記-day05java-day5早上下午

為什麼會發明JAVA?

1、提供解釋的環境(Java不是真正的編譯語言)
    *加速我們的開發
    *一次編寫到處運作(跨平台)
        不同平台:作業系統不同
                作業系統核心不同
                操作支援的機器語言不同
    真正的編譯語言一般隻是針對目前系統中的核心來編譯
    換個平台就不行了
    
    java語言為什麼可以跨平台?
    java在不同平台有針對該平台的不同虛拟機
    
    *支援多線程
    *動态支援更新(JRE)
2、java提供更加簡單的程式設計方式
    *代碼更加強壯: 
    a、沒有指針
    (程式員不需要自己控制指針來針對不同資料的操作)
​
    b、代碼中沒有記憶體指針管理
    (程式員不需要自己控制記憶體的配置設定使用和釋放。
    避免了操作不當導緻的記憶體溢出或洩露,這些JVM會搞定)
​
    c、純正的面向對象程式設計
    (在java中一切皆為對象,做任何操作都是需要對象:
    例如:調用方法、通路屬性都是通過對象來操作的。
    但是static修飾的方法和屬性除了對象也可以用類名來通路)
           

編譯語言

hello... --編譯--> xxx(計算機直接執行)
例如:C語言
​
但是java并不是真正的編譯語言
Hello.java--編譯-->Hello.class-->JVM
--解釋位元組碼-->計算機執行
           

垃圾回收器

1、java不需要自己配置設定記憶體

JAVA有一個關鍵字:new
同時他也代表了一個操作:建立對象的操作
使用new關鍵字就表示我們要在java中建立對象,在建立對象之前new關鍵字
記憶體中自動為我們申請一塊空間,用來存放即将建立來的對象,同時我們要用
的資料也在這個記憶體中
​
例如:Person p = new Person(1,"Tom",20);
使用new關鍵字來建立Person類的一個對象,也稱一個執行個體
同時在記憶體中從JVM申請一塊記憶體空間存放這個對象,把對象的資料也存進來
           

2、new關鍵字建立對象使用了記憶體,最終要把記憶體釋放

(不用程式員管理)JVM有一個叫垃圾回收器
 作用:回收記憶體中使用過,現在已經不用了的記憶體空間
           

3、垃圾回收器是什麼?

其實垃圾回收器也是JVM中的一對代碼,它運作之後可以幫助我們回收不再使用的記憶體空間,以便讓接下來要使用的代碼繼續使用。
           

4、我們是否能控制垃圾回收器去回收記憶體垃圾?

不能,我們隻能通過調用相關的API建議垃圾回收器去清理記憶體垃圾。
但是是不是立刻清理,程式員控制不了。需要根據目前記憶體使用情況
和垃圾回收器的内置算法來決定的。
​
對應的API:
java.1ang.System.gc(); 
java.1ang.Runtime.gc();
           

位元組碼驗證

一個class檔案被加載到JVM記憶體之後,實作要經過位元組碼驗證,驗證通過後再确定哪些代碼是解釋執行的,那些代碼是JIT及時編譯執行的
           

位元組碼驗證規則

1、檢查目前class檔案的版本和JVM的版本是否相容
高版本的JDK編譯出的class檔案,使用低版本的JDK[無法]運作
低版本的JDK編譯出的class檔案,使用高版本的JDK[可以]運作
​
2、堅持代碼是否破壞系統的完整性
​
3、檢查目前代碼是否有棧的溢出的情況
​
4、檢查目前代碼的參數類型是否正确
​
5、檢查目前代碼中的類型轉換是否正确
           

解釋執行

是java并不是真正的編譯語言,編譯成的class檔案需要JVM檔案
進行解釋,解釋成計算機可以執行的代碼。解釋一行代碼就執行一
行代碼。
​
如果全是如上方法,效率不高。
           

JIT(Just InTime)即時編譯

它是JVM中執行java代碼的一種方式,JVM可以使用JIT把java中的熱點代碼直接編譯成計算機可以運作的代碼,這樣接下來再調用這個熱點代碼的時候,就可以直接使用編譯好的代碼讓計算機直接運作,這樣子可以提高運作效率。
           
2020/2/25學習筆記-day05java-day5早上下午