instanceof:是Java里面的二元運(yùn)算符,判斷左邊的對(duì)象是否是右邊類的實(shí)例。假如是的話,返回true;假如不是的話,返回false。
示例一:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
eg:我們聲明了一個(gè)String對(duì)象引用,指向一個(gè)String對(duì)象,然后用instanceof來測試它所指向的對(duì)象是否是Object類的一個(gè)實(shí)例,顯然,這是真的,所以返回true,也就是isObject的值為true。
示例二:
instanceof有一些用處。
比如我們寫了一個(gè)處理賬單的系統(tǒng),其中有這樣三個(gè)類:
public class Bill {//省略細(xì)節(jié)}
public class PhoneBill extends Bill {//省略細(xì)節(jié)}
public class GasBill extends Bill {//省略細(xì)節(jié)}
在處理程序里有一個(gè)方法,接受一個(gè)Bill類型的對(duì)象,計(jì)算金額。
假設(shè)兩種賬單計(jì)算方法不同,而傳入的Bill對(duì)象可能是兩種中的任何一種,所以要用instanceof來判斷:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//計(jì)算電話賬單
}
if (bill instanceof GasBill) {
//計(jì)算燃?xì)赓~單
}
...
}
這樣就可以用一個(gè)方法處理兩種子類。
然而,這種做法通常被認(rèn)為是沒有好好利用面向?qū)ο笾械亩鄳B(tài)性。
其實(shí)上面的功能要求用方法重載完全可以實(shí)現(xiàn),這是面向?qū)ο缶幊虘?yīng)有的做法,避免回到結(jié)構(gòu)化編程模式。
只要提供兩個(gè)名字和返回值都相同,接受參數(shù)類型不同的方法就可以了:
public double calculate(PhoneBill bill) {
//計(jì)算電話賬單
}
public double calculate(GasBill bill) {
//計(jì)算燃?xì)赓~單
}
所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。
instanceof 一般情況下 用在對(duì)象類型的強(qiáng)制轉(zhuǎn)換 ,
例如:
//繼承關(guān)系
class Manager extends Employee {}
public void doSomething(Employee e) {
if ( e instanceof Manger){
Manager m = (Manager) e ;
}
}
示例三:
//判斷里面的意思是:context對(duì)象是否來自actvity。
if (context instanceof Activity) {
Log.i(LOGTAG, "Callback Activity...");
Activity callbackActivity = (Activity) context;
callbackActivityPackageName = callbackActivity.getPackageName();
callbackActivityClassName = callbackActivity.getClass().getName();
}
Android里面context還可能代表application和service。