instanceof 理解:
java 中的instanceof 是一個二元操作符(運算符),是Java的保留關鍵字,可以理解爲和 >=,<=,==等操作符屬同一類,它的作用是用來判斷instanceof 左邊對象是否爲instanceof 右邊類的實例,返回一個boolean類型值。還可以用來判斷子父類的所屬關係。
instanceof 用法:
result = object instanceof Class
參數:
result :布爾類型。
object :必選項。任意對象表達式。
Class:必選項。任意已定義的對象類。
說明:
如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object 不是指定類的一個實例,或者 object 是 null,則返回 false。
但是instanceof在Java的編譯狀態和運行狀態是有區別的:
在編譯狀態中,class可以是object對象的父類,自身類,子類。在這三種情況下Java編譯時不會報錯。
在運行轉態中,class可以是object對象的父類,自身類,不能是子類。在前兩種情況下result的結果爲true,最後一種爲false。但是class爲子類時編譯不會報錯。運行結果爲false。
簡單Demo:
接口Person
public interface Person {
public void eat();
}
實現類People
public class People implements Person {
private int a=0;
@Override
public void eat() {
System.out.println("======"+a);
}
}
子類xiaoming:
public class xiaoming extends People {
private String name;
@Override
public void eat() {
System.out.println("+++++++++");
}
}
主函數
public static void main(String[] args) {
People p=new People();
xiaoming x=new xiaoming();
System.out.println(p instanceof Person);//編譯正常,運行爲true
System.out.println(p instanceof xiaoming); //編譯正常,運行爲false
System.out.println(x instanceof Person);//編譯正常,運行爲true
System.out.println(x instanceof People);//編譯正常,運行爲true
}
注意:上面2處的代碼在編譯時不會報錯。
實際項目中的使用:
解釋:
上圖中的 String reportExportDate = ValueUtils.parseStringValue(request.getParameter("reportExportDate"), "");
是從request中提取頁面傳來的參數,調用底層(包爲:smartFramework2-core-1.0.2.jar)的如下圖方法,判斷reportExportDate是否存在,以及是否爲String類型,如果不爲空且爲String類型則返回本身,如果不爲空但是不是String類型,則轉型爲String類型返回,否則返回返回默認String類型參數defaultValue。