天天看點

JAVA的一些常識(綁定,多态,反射,RTTI)

多态

何為多态?嗯就是多種狀态,如果前面要加上代詞的話,我想應該是對象。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檔案。