多态
何為多态?嗯就是多種狀态,如果前面要加上代詞的話,我想應該是對象。java多态可以分為三種,即重寫多态、重載多态、泛型多态(通常意義上的多态指的是重寫多态)。
重寫多态:子類可以将父類的任意虛方法根據需要進行重寫,同樣的聲明多種實作,一個很簡單的例子:
/**
* Created by Lee Y on 2016/3/28.
*/
public class Polymorphic {
public static void main(String[] args) {
A a = new A();
A b = new B();
A c = new C();
a.f();
b.f();
c.f();
B b1 = new B();
v(b1);
}
public static void v(A a){
a.f();
}
}
class A{
void f(){
System.out.println("this is A");
}
final void d(){
}
}
class B extends A{
void f(){
System.out.println("this is B");
}
}
class C extends A{
void f(){
System.out.println("this is C");
}
}
/*
output:
this is A
this is B
this is C
this is B
*/
上述代碼是多态與動态綁定非常簡單的一個展示,子類B和C重寫了父類的f方法,同時聲明三個A類的引用,分别NEW成ABC的執行個體,同時調用f方法,結果顯而易見是正确的。可能這個簡單的例子展現的不是那麼明顯,那麼請看v方法,v方法的參數是一個A類的引用,我将B類的一個對象引用b1傳進去(請先區分好對象的引用和對象的執行個體都是什麼),這表面看上去有點像強轉,可是結果卻是程式正确的調用了B類裡的f方法,而不是A類中的f方法,是以這不是強轉,而是多态,多态的好處是非常顯而易見的。
重載多态:即在同樣的命名空間内,可以定義多個同名方法,但要求參數清單的長度或參數類型不同,jvm會根據參數清單和參數類型動态的選擇調用的方法。
泛型多态:java泛型單開一章來寫,因為比較有意思。
綁定
這裡指的前期綁定(靜态綁定)和後期綁定(動态綁定),這裡先不讨論java對動态綁定是如何實作的,隻說它的作用。
靜态綁定:指程式在編譯期就确定對象調用的方法的過程。
動态綁定:指程式在運作期間臨時确定對象所調用的方法的過程,上面的代碼就是動态綁定的簡單例子。
RTTI
與反射差別,RTTI指程式運作期間的類型檢查,jvm在運作時隻在必要的時候進行RTTI,因為它的效率并不比多态好,是以請盡量使用多态而不是RTTI。
具體在什麼條件下會進行RTTI,我還很模糊,容我過幾天再寫=。=
反射
java最屌的功能,沒有之一,就是反射,java的反射允許你在運作期間對一個完全未知的類進行任何操作(通過類名),包括所有私有成員,甚至是匿名内部類,當然使用反射的前提是,必須得到這個類class檔案。