引言
滴,第二天卡。
五、關鍵字
-static
-初始化順序
-靜態變量和靜態語句塊優先於實例變量和普通語句塊,靜態變量和靜態語句塊的初始化順序取決於它們在代碼中的順序。
-存在繼承的情況下,初始化順序為:
父類(靜態變量、靜態語句塊)
子類(靜態變量、靜態語句塊)
父類(實例變量、普通語句塊)
父類(構造函數)
子類(實例變量、普通語句塊)
子類(構造函數)
-靜態變量 private static int y;
-又稱為類變量,也就是說這個變量屬於類的,類所有的實例都共享靜態變量,可以直接通過類名來訪它;靜態變量在內存中
只存在一份。
-靜態方法 public static void func1(){}
-靜態方法在類加載的時候就存在了,它不依賴於任何實例。所以靜態方法必須有實現,也就是說它不能是抽象方法
-只能訪問所屬類的靜態字段和靜態方法,方法中不能有 this 和 super 關鍵字。
-靜態語句塊 static {System.out.println("123");}
-靜態語句塊在類初始化時運行一次。
-靜態內部類 static class StaticInnerClass {}
-非靜態內部類依賴於外部類的實例,而靜態內部類不需要。
-靜態內部類不能訪問外部類的非靜態的變量和方法。
-靜態導包 import static com.xxx.ClassName.*
-在使用靜態變量和方法時不用再指明 ClassName,從而簡化代碼,但可讀性大大降低
-final
-聲明字段
-對於基本類型,final 使數值不變
final int x = 1;
//x=0; 這里會報錯:cannot assign value to final variable 'x'
-對於引用類型,final 使引用不變,也就不能引用其它對象,但是被引用的對象本身是可以修改的。
final A y = new A();
y.a = 1;
-聲明方法
-聲明方法不能被子類重寫。
-private 方法隱式地被指定為 final,如果在子類中定義的方法和基類中的一個 private 方法簽名相同,此時子類的
方法不是重寫基類方法,而是在子類中定義了一個新的方法。
-聲明類
-聲明類不允許被繼承。
六、Object 常見的方法
-主要方法
-public boolean equals(Object obj)
-public native int hashCode()
-public String toString()
-protected native Object clone() throws CloneNotSupportedException
-native關鍵字:
-一個native方法就是一個Java調用非Java代碼的接口。一個native方法是指該方法的實現由非Java語言實現,比如用
C或C++實現。
-在定義一個native方法時,並不提供實現體(比較像定義一個Java Interface),因為其實現體是由非Java語言在外
面實現的。
-equals()
-與null的比較
-對任何不是 null 的對象 x 調用 x.equals(null) 結果都為 false
x.equals(null); // false;
-equals()和null區分
-對於基本類型,== 判斷兩個值是否相等,基本類型沒有 equals() 方法。
-對於引用類型,== 判斷兩個變量是否引用同一個對象,而 equals() 判斷引用的對象是否等價
-hashCode()
-主要作用是為了配合基於散列的集合一起正常運行,這樣的散列集合包括HashSet、HashMap以及HashTable
-在覆蓋 equals() 方法時應當總是覆蓋 hashCode() 方法,保證等價的兩個對象散列值也相等。
-hashCode() 返回散列值,而 equals() 是用來判斷兩個對象是否等價。等價的兩個對象散列值一定相同,但是散列值相同
的兩個對象不一定等價。
-toString()
-將當前變量的數據類型轉換為String類型,同時也方便打印輸出
-clone()
-官方解釋
-返回一個要克隆對象的副本,克隆的類型依賴被克隆對象
-誤區
-clone() 方法並不是 Cloneable 接口的方法,而是 Object 的一個 protected 方法。Cloneable 接口只是規定了這個方法。
-在使用clone()時需注意,需要拋出異常,和強制類型轉換
-cloneable()
-在需要clone的對象上實現(implements)Cloneable接口,然后再在類中加上clone方法,在方法中只需要調用
super.clone(),即可根據自己的需要實現
-淺拷貝
-拷貝對象和原始對象的引用類型引用同一個對象
-深拷貝
-拷貝對象和原始對象的引用類型引用不同對象。
七、異常
-檢查性異常: 不處理編譯不能通過
非檢查性異常:不處理編譯可以通過,如果有拋出直接拋到控制台
運行時異常: 就是非檢查性異常
非運行時異常: 就是檢查性異常
-Throwable 可以用來表示任何可以作為異常拋出的類,分為兩種: Error 和 Exception。
-Error
-是指程序無法處理的錯誤,表示應用程序運行時出現的重大錯誤。例如jvm運行時出現的OutOfMemoryError以及
Socket編程時出現的端口占用等程序無法處理的錯誤。
-Exception
-分為運行時異常跟編譯異常
-運行時異常
-即RuntimeException及其之類的異常。這類異常在代碼編寫的時候不會被編譯器所檢測出來,是可以不需要被捕獲
,但是程序員也可以根據需要進行捕獲拋出。
常見的RUNtimeException有:NullpointException(空指針異常),ClassCastException(類型轉換異常),
IndexOutOfBoundsException(數組越界異常)等。
-編譯異常
-RuntimeException以外的異常。這類異常在編譯時編譯器會提示需要捕獲,如果不進行捕獲則編譯錯誤。常見編譯
異常有:IOException(流傳輸異常), SQLException(數據庫操作異常)等。
-java處理異常的機制:
-拋出異常以及捕獲異常(try---catch或try --- catch --- finally 代碼塊),一個方法所能捕捉的異常,一定是Java代碼
在某處所拋出的異常。簡單地說,異常總是先被拋出,后被捕捉的。
-throw跟throws的區別:
-throws是方法可能拋出異常的聲明,throw是語句拋出一個異常(可以是自定義需繼承Exception,也可以是java自己給
出的異常類)
-throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常。
八、java各版本特性
-java5
-很重要的一個版本,有泛型、枚舉、自動裝箱/拆箱、可變參數、注解、foreach循環、靜態導入、新的線程模型等等更新。
-java6
-雞肋的版本,有JDBC4.0更新、Complier API、WebSevice支持的加強等更新。
-java7
-有一些比較重要的更新,如異常處理增加了被抑制的異常、捕獲多異常、try-with-resource自動釋放資源等,還有應用了
G1垃圾回收器、switch可以使用String類型、泛型自動判斷類型、fork/join框架把任務細分並使用多處理器處理、支持二
進制字面量等
-java8
-很多的新特性,比如編譯器、類庫、開發工具和JVM(Java虛擬機)。
-最重要的一點,Java8開始支持了Lambda表達式
-java9
-Java 平台級模塊系統、Linking、Shell : 交互式 Java REPL、改進的 Javadoc等
-詳細特性介紹:java各版本特性