java基礎拾漏補缺
一、類之間的三種關係:
1. 依賴關係(use-a)
2. 繼承關係(is-a)
3. 聚合關係 (has-a)
二、Java中的方法,得到的總是引數的值拷貝。
1. 對於原始型別來說,引數是最簡單的值拷貝,因而,在方法中對引數的修改無法對傳參的值產生影響。
2. 對於引用型別來說,引數是對引用的一次拷貝。劃重點:值拷貝。
三、Java中的轉型問題。
1. 基本型別的轉型(無資料丟失)。
a. byte -> short -> int -> long
b. byte -> short -> int -> double
c. char -> int -> long
d. char -> int -> double
2. 基本型別的轉換(有資料丟失)
a. long -> float
b. int -> float
c. long -> double
轉換規則: double > float > long > int 。
3. 基本型別的強制轉換。(type) value。一般有資料丟失情況存在。
4. 引用型別的轉換。向上,向下是相對於被操作的引用變數的型別而言的。轉換前是父類型別,轉換後是子類型別,則成為向下轉型,否則成為向上轉型。向上轉型是一個自動的過程。
a. 向下轉型。將父類型別的引用強制轉換並賦值給子類型別的引用,稱為向下轉型。向下轉型可以獲得子類的方法列表。限制,被向下轉型的子類,必須是目標子類的例項,否則會報錯。
b. 向上轉型。子類型別的物件被賦值給父類型別的引用變數,稱為向上轉型。向上轉型存在方法的丟失現象。方法列表中只存在父類的方法列表。
c. 繼承鏈中物件方法的呼叫的優先順序:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
四、重寫。
a. 重寫是子類對父類中允許訪問的方法的實現過程進行重寫,其方法名,形參不能改變,返參型別和父類相同或者是父類的返參型別的子類,子類方法的訪問許可權不能小於父類方法的訪問許可權。
五、過載
a. 過載是在同一個類中,多個方法的方法名相同而引數不同的一種規則。
六、多型和動態繫結。
a. 多型。
在java中,一個父類型別的變數,既可以引用一個父類型別的物件,也可以引用一個子類型別的物件,稱之為多型,物件引用變數是多型的。
b. 動態繫結。
1.如果被呼叫的方法是private、static或者final方法,則在編譯期間,編譯器就可以準確的直到呼叫了哪個方法,那麼這種方法繫結稱之為靜態繫結。與之相對的是,有些方法的呼叫需要根據其執行時的實際物件來確定,這種繫結稱之為動態繫結。
2.方法的動態繫結,依照如下規則:
this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
3.由於方法動態繫結的原因,每次方法執行時都需要大量的搜尋,因而虛擬機器為每個類都預先生成了一個方法表,以提高效能。
七、自動裝箱和拆箱
1. 自動裝箱。編譯器自動地將原始型別的值轉換為對應包裝器的物件型別。byte、short、char、int、long、float、double、boolean對應的包裝器類為Byte、Short、Character、Integer、Long、Float、Double和Boolean。
2. 自動拆箱。編譯器自動的將包裝器的物件型別轉換為原始型別的值。
3. 注意事項:
a. 儘量避免大量的自動裝箱和自動拆箱的情況出現,例如在迴圈中的自動裝箱和自動拆箱,需要生成大量的無用的包裝型別物件。
b. 自動裝箱、自動拆箱遇到過載時,首先會試圖呼叫無需自動裝箱拆箱的方法,然後才是需要自動裝箱的方法。
c.Integer的快取。對於-128到127之間的數字,Integer對其進行了快取,在自動裝箱的ValueOf方法呼叫的時候,會將快取的Integer物件直接返回給程式,因而,對於-128到127的數字,同時發生了自動裝箱時候,得到的是同一個物件。但是,對於Integer建構函式構造的物件來說,永遠都是不相等的。
d. 混亂的使用原始型別和包裝型別,可能造成空指標異常。對於static Integer count;其預設初始換值是null。而static int count的預設初始化值則是0。
f. 含有算術運算的過程,會發生自動拆箱操作。
八、可變引數方法
public void method(String... args)
九、== 和 equals() 方法
1. ==
1. 比較基本型別的值。
2. 比較物件在記憶體中的地址是否相同。
2. equals方法
1. 一般來說,首先比較兩個物件的記憶體地址是否相同,相同直接返回true。
2. 對物件的真實值進行比較,如果真實值相同,那麼就返回true,否則返回false。
十、 內部類。
1.內部類分類。
a.成員內部類。
b.靜態內部類。
c.區域性內部類。
d.匿名內部類。
2.成員內部類。
a.成員內部類可以直接訪問外部的私有方法和屬性。
b.當成員內部類的屬性和方法與外部類的屬性和方法名字相同時,可以通過Outer.this.name來訪問外部類的屬性或者方法。
c.成員內部類不能有static的方法和屬性。
d. 必須先建立外部類,才可以建立內部類。
c. 外部類可以通過內部類的物件來訪問內部類的私有變數和方法。
3.區域性內部類。區域性內部類是定義在方法中的內部類。
a.區域性內部類不能有public或者private等訪問修飾符。
b.區域性內部類可以訪問final修飾的區域性變數。
4. 匿名內部類。匿名內部類是直接生成了物件的無名類。
5. 靜態內部類。
a、建立靜態內部類方式:Outer.Inner inner = new Outer.Inner();靜態內部類不依賴於外部類。
b、外部類可通過內部類的物件呼叫內部類的私有成員變數或方法。
c、靜態內部類訪問外部類的靜態成員變數或方法必須是靜態的。
d、靜態內部類中可定義靜態的成員變數和方法。
e、外部類可以建立靜態內部類的例項,即使是私有的;並可通過內部類的例項訪問內部類的成員變數和方法,即使是私有的。
f、單利模式中的靜態內部類模式。
十一、反射。
反射是在執行時訪問類的構造方法,屬性,靜態變數,方法等的能力。在執行時對類的屬性等進行訪問和修改的能力。
1.獲取陣列的型別。obj.getClass().getComponentType()。
2.動態生成陣列。Array.newInstance(Class<?>,length),返參為一個數組例項物件。
3.反射中的一些常用類Array、Field、Method、Constructor、Modifier等。
4.java建立物件的幾種方法:
a.new關鍵字。
b.newInstance()方法。
c.clone()方法。
d.反序列化。
十二、動態代理。
1.靜態代理的問題。有多少個需要代理的類,就需要有多少個靜態代理類,這會造成類爆炸。
2.jdk動態代理。jdk動態代理與java.lang.reflect包內的三個類有關:
a.InvocationHandler類。
b.Method類。
c.Proxy類。
3.建立一個動態代理的一般步驟:
a.建立一個InvocationHandle實現類,並實現其invoke方法。
b.建立被代理的類的物件例項。
c.通過Proxy類的newProxyInstance()方法例項化一個代理物件。傳參分別為被代理的ClassLoader和Interfaces以及a中handle實現類的例項。
d.通過Proxy類的例項呼叫被代理類例項的方法,即可實現對被代理類方法的代理。