- 包裝類(Wrapper Class),爲8種基本數據類型定義對應的引用類型,解決了基本數據類型的變量不能當成Object類型變量使用的問題。
- JDK1.5以後提供了自動裝箱和自動拆箱的功能。1.5以前把基本數據類型變成包裝類實例需要通過對應包裝類的構造器來實現。
自動裝箱:可以把一個基本數據類型變量直接賦值給Object變量。自動拆箱:可以直接把包裝類對象直接賦值給一個對應的基本數據類型變量。
public static void main(String[] args) { Integer inObj = 5; //自動裝箱 Object boolObj = true; //自動裝箱 boolObj 是一個布爾型變量 Object stringObj = "true"; int it = inObj; //自動封箱 Integer對象賦值給int類型的變量 if (stringObj instanceof String) { // strObject對象爲String類,String與Obeject存在繼承關係 boolean b = (Boolean)boolObj; //自動封箱 強轉後賦值 System.out.println(b); // 輸出 true System.out.println(it); // it值爲5 } }
- 把字符串類型的值轉換爲基本類型的值的兩種方式。
- 利用包裝類的的parseXXX(String s)靜態方法(除了Charecter)
- 利用包裝類提供的Xxx(String s)構造器。對應的基本數據類型必須用對應的封裝類,否則會拋出異常(如果字符串爲 “1.23” ,用Integer類.parseTnt(),拋出異常)。
String類提供了多個重載valueOf()方法,用於將基本類型數據轉換爲字符串。
public static void main(String[] args) { // 字符串轉基本數據類型 String s = "123"; int it1 = Integer.parseInt(s); // 第一種方式 int it2 = new Integer(s); // 第二種方式,都輸出結果 123 // 基本數據類型轉字符串 float f = 3.4f; String fS = String.valueOf(f); // FS = "3.4" }
int類型自動裝箱爲Integer類時,-127到128之間的整數自動裝箱爲Integer實例,並放入cache數組中存放,可用於比較相等。不在此範圍的數系統總是重新創建一個實例。
public static void main(String[] args) { Integer a = 2; Integer b = 2; a == b // 爲true,在同一個數組中 Integer a1 = 128; Integer b1 = 128; a == b // 爲false,兩個實例,兩個引用所以值不相等 }
- Java7爲所有包裝類提供了compare(value1, value2);方法,用於比較兩個基本類型的大小,相等返回0,value1 < value2返回-1,value1 > value2返回1。String類沒有,因爲String不是包裝類。
- toString();方法是Object類裏一個實例方法(該方法總是返回該對象實現類的“類名 + @ + hashCode”),所有Java類都有該方法,重寫該方法用於實現“自我描述”,也就是輸出相關信息的功能。
“==”運算符判斷兩個變量是否相等時,如果兩個變量是基本類型變量,且都是數值類型(不要求數據類型嚴格相同),只要兩個變量的值相等就返回true。如果兩個變量是引用類型,只有它們都指向同一個對象時才相等。
int it = 65; float f1 = 65.0f; System.out.println(it == f1); // true,類型不嚴格要求 char ch = 'A'; System.out.println(it == ch); // true,類型不嚴格要求 String str1 = "as"; String str2 = "as"; System.out.println(str1 == str2); // true,引用相同都爲"as",常量池只有一個"as"副本 String str3 = new String("hello"); String str4 = new String("hello"); System.out.println(str3.equals(str4)); // true,值相同 System.out.println(str3 == str4); // false,引用不一樣
- String str = “aa”; 與 String str = new String(“aa”); 的區別,第一種定義方式,JVM會用常量池來管理字符串。第二種JVM會先用常量池來保管“aa”,在創建一個新的String對象保存於堆內存。
常量池專門用於管理在編譯時被確定並被保存在已編譯的.class文件中的一些數據。
String s1 = "abcd"; String s2 = "ab"; String s3 = "cd"; String s4 = "ab" + "cd"; // 編譯時可以確定s5的字符串值爲"abcd"。 String s5 = "a" + "b" + "cd"; // s1,s2,s3,s4,s5引用的字符串在編譯時就確定了,引用常量池中的同一個字符串對象。 // 編譯時無法確定s6的字符串值爲多少,此時是通過s2連接s3確定。 String s6 = s2 + s3; String s7 = new String("abcd"); System.out.println(s1 == s4); // true System.out.println(s1 == s5); // true System.out.println(s1 == s6); // false, 猜測是因爲不確定s6的引用字符串對象導致的, // 等弄明白了回來填坑 System.out.println(s1 == s7); // false, s7引用堆內存中的"abcd",與s1不同
- equals();方法是Object類提供的一個實例方法,也要求兩個引用變量指向同一個對象纔會返回true。所以可以按照需要重寫,String已經重寫。
- static修飾的成員爲類成員,屬於整個類,不屬於單個實例。類成員不可以訪問實例成員,因爲有可能出現類成員已經初始化完成,但實例成員還沒有初始化的情況。
- 單例類,這個類只能創建一個實例。構造器爲private。簡單單例類實現
- final關鍵字可用於修飾類、變量和方法,指定初始值後不可改變。final修飾的類變量必須在靜態初始化塊或聲明定義時指定初始值。final修飾的實例變量必須在非靜態初識化塊、聲明定義、或者構造器中指定初始值。
- 系統不會對局部變量進行初始化,用final修飾局部變量可指定也可不指定。final修飾的形參不能賦值。
- final修飾引用類型變量保存的是引用,保證這個引用變量所引用的地址不會改變,這個對象可以改變。
- final修飾的方法不可以重寫,可以重載。fianl修飾的類不可以有子類。
- 不可變類創建該類實例後,其實例變量是不可改變的。如果程序經常要使用相同的不可變類實例,應該考慮緩存這個不可變類的實例,降低系統開銷。
- 只有方法簽名,沒有方法實現的方法就是抽象方法,包含抽象方法的類只能是抽象類。
- 抽象類,抽象方法用abstract修飾,抽象類不能被實例化,只能用作父類被繼承,其中包含五種成員:成員變量、方法(普通和抽象都可以)、構造器、初始化塊、內部類。
- abstract修飾方法(不能用於構造方法),必須由子類重寫具體實現,修飾類只能被繼承。所以abstract與final不可同時使用(不是絕對的)。但是abstract修飾的方法不能爲private,因爲它需要被子類重寫。
- 接口interface不能包含構造器和初始化塊定義,其成員有:成員變量(只能是靜態常量static final修飾),方法(只能是抽象實例方法,類方法或者默認方法),內部類。各成員都用public修飾。
- 接口主要用途:1. 定義變量,也可用於進行強制類型轉換。2. 調用接口中定義的常量。3. 被其他類實現。
Java瘋狂講義讀書筆記第六章(一)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.