標籤

二元樹 (1) 字串常數池 (1) 投資 (3) 每月損益 (37) 例外處理 (1) 泛型 (2) 股票 (15) 指標 (5) 英文 (8) 基本資料型別 (1) 期貨 (1) 程式交易 (10) 量化投資 (5) 亂亂寫 (3) 概念 (3) 資料結構 (3) 演算法 (3) 數學 (3) 轉型 (1) AMA (1) ArrayList (1) assert (1) BeautifulSoup (1) C/C++ (8) casting (1) ClassCastException (1) classpath (1) Collection (4) Comparable (1) comparTo() (1) constructor (1) database (3) Debian (1) Dropbox (2) EA (2) enum (1) equals() (2) exception (3) extends (1) ffmpeg (1) final (1) Git (1) HashMap (1) HashSet (1) hasNext() (1) HTS (3) instanceof (1) IS-A (1) Iterator (1) JAVA (43) length (1) Linux (31) List (1) Mac (6) Map (1) ML (2) MT4 (6) MySQL (2) next() (1) NullPointerException (1) Number (1) Numpy (2) OpenCart (1) OpenCV (3) OSX (1) overloading (1) overriding (3) pandas (2) PHP (8) PriorityQueue (1) Python (11) Queue (1) random() (1) reverse() (1) Samba (1) SCJP (21) sqrt() (1) synchronized (1) talib (1) ufw (1) uTorrent (1) var-args (2) VHF (1) vim (2) Yhoo知識+ (4)

2012年9月17日 星期一

instanceof測試

class Animal{
    public void testIsA(Animal a){
        System.out.println("Animal");
    }
}
class Dog extends Animal{
    public void testIsA(Animal a){    //a是Animal的參考
        System.out.println(a instanceof Animal);    //但instanceof會看a的物件型別
        System.out.println(a instanceof Dog);
        //a.show();            //此行會產生錯誤,因為a的型別為Animal,而該class無show函式
    }
    public void show(){
        System.out.println("I am class Dog");
    }
}

public class InstanceOfTest{
    public static void main(String[] args){
        Animal dog1 = new Animal();
        Animal dog2 = new Dog();
        Dog dog3 = new Dog();
       
        System.out.println(dog1 instanceof Animal);        //true; Animal IS-A Animal
        System.out.println(dog1 instanceof Dog);        //false; Animal IS-A Dog
        System.out.println(dog2 instanceof Animal);        //true; Dog IS-A Animal
        System.out.println(dog2 instanceof Dog);        //true; Dog IS-A Dog
        System.out.println(dog3 instanceof Animal);        //true; Dog IS-A Dog
       
        dog1.testIsA(dog1);        //Animal,*****
        dog1.testIsA(dog2);        //Animal,overriding取決於呼叫的物件
        dog1.testIsA(dog3);        //Animal,*****
       
        dog1.testIsA(dog1);        //Animal,overriding取決於呼叫的物件
        dog2.testIsA(dog2);        //true, Dog IS-A Animal
                                //true, Dog IS-A Dog
        dog3.testIsA(dog3);        //true,true,
    }
}

======
結論:
1・父類別物件可以呼叫子類別函式(通常父類別看不見子類別內的成員),但只限於被子類別overriding過的函式。
2・不管傳入函式的引數為何,皆以函式之參數的型別宣告為準。
3・而instanceof會去看參考所指向的物件,並以該物件為準。

沒有留言:

張貼留言