一:
instanceof是Java的一個二元操作符,和==, >, <是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數據。舉個例子:
String s = "I AM an Object! ";
boolean isObject = s instanceof Object;
我們聲明瞭一個String對象引用,指向一個String對象,然後用instancof來測試它所指向的對象是否是Object類的一個實例,顯然,這是真的,所以返回true,也就是isObject的值爲True。
instanceof有一些用處。比如我們寫了一個處理賬單的系統,其中有這樣三個類:
public class Bill {//省略細節}
public class PhoneBill extends Bill {//省略細節}
public class GasBill extends Bill {//省略細節}
在處理程序裏有一個方法,接受一個Bill類型的對象,計算金額。假設兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//計算電話賬單
}
if (bill instanceof GasBill) {
//計算燃氣賬單
}
...
}
這樣就可以用一個方法處理兩種子類。
然而,這種做法通常被認爲是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了:
public double calculate(PhoneBill bill) {
//計算電話賬單
}
public double calculate(GasBill bill) {
//計算燃氣賬單
}
另外,你在jdk文檔中是找不到instanceof的說明的,就像你找不到>,<,=符號的說明一樣,這是sun的不足之處吧。
二:
Example: Class Teacher and Student are subclass of class Person.
Person p;
Teacher t;
Student s;
p, t and s are all non-null.
if(t instanceof Person) { s = (Student)t; }
What is the result of this sentence?
A. It will construct a Student object.
B. The expression is legal.
C. It is illegal at compilation.
D. It is legal at compilation but possible illegal at runtime.
(c)
instanceof操作符的作用是判斷一個變量是否是右操作數指出的類的一個對象,由於java語言的多態性使得可以用一個子類的實例賦值給一個父類的變量,而在一些情況下需要判斷變量到底是一個什麼類型的對象,這時就可以使用instanceof了。當左操作數是右操作數指出的類的實例或者是子類的實例時都返回真,如果是將一個子類的實例賦值給一個父類的變量,用instanceof判斷該變量是否是子類的一個實例時也將返回真。此題中的if語句的判斷沒有問題,而且將返回真,但是後面的類型轉換是非法的,因爲t是一個Teacher對象,它不能被強制轉換爲一個Student對象,即使這兩個類有共同的父類。如果是將t轉換爲一個Person對象則可以,而且不需要強制轉換。這個錯誤在編譯時就可以發現,因此編譯不能通過。
【轉自:http://hi.baidu.com/skylin/blog/item/352e9e5110c48c2143a75b47.html】