一 instanceof運算符java
二代碼示例spa
1 public class InstanceofTest 2 { 3 public static void main(String[] args) 4 { 5 // 聲明hello時使用Object類,則hello的編譯類型是Object, 6 // Object是全部類的父類, 但hello變量的實際類型是String 7 Object hello = "Hello"; 8 // String與Object類存在繼承關係,能夠進行instanceof運算。返回true。 9 System.out.println("字符串是不是Object類的實例:" 10 + (hello instanceof Object)); 11 System.out.println("字符串是不是String類的實例:" 12 + (hello instanceof String)); // 返回true。 13 // Math與Object類存在繼承關係,能夠進行instanceof運算。返回false。 14 System.out.println("字符串是不是Math類的實例:" 15 + (hello instanceof Math)); 16 // String實現了Comparable接口,因此返回true。 17 System.out.println("字符串是不是Comparable接口的實例:" 18 + (hello instanceof Comparable)); 19 String a = "Hello"; 20 // // String類與Math類沒有繼承關係,因此下面代碼編譯沒法經過 21 // System.out.println("字符串是不是Math類的實例:" 22 // + (a instanceof Math)); 23 } 24 }
運行結果.net
字符串是不是Object類的實例:truecode
字符串是不是String類的實例:trueorm
字符串是不是Math類的實例:false對象
字符串是不是Comparable接口的實例:trueblog
三應用場景繼承
下面我來模擬一個簡單的應用場景,加深記憶並與同窗們分享交流接口
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 public class Test{ 5 6 public static void main(String[] args) { 7 Object object = new Date(); 8 print(object); 9 } 10 11 public static void print(Object object) { 12 Date date = (Date) object; 13 String format = "yyyy-MM-dd HH:mm:ss"; 14 String result = new SimpleDateFormat(format).format(date); 15 System.out.println(result); 16 } 17 }
場景分析:沒法保證傳入print方法的實參必定爲Date對象,若是傳入的不是由Date或其子類建立的對象,那麼以上代碼就會引起「java.lang.ClassCastException」異常,這時咱們可使用instanceof運算符,用於強制類型轉換以前檢查對象的真實類型以免類型轉換異常,從而提升代碼健壯性。字符串
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 public class Test{ 5 6 public static void main(String[] args) { 7 Object object = new String(); 8 print(object); 9 } 10 11 public static void print(Object object) { 12 if (object instanceof Date) { 13 Date date = (Date) object; 14 String format = "yyyy-MM-dd HH:mm:ss"; 15 String result = new SimpleDateFormat(format).format(date); 16 System.out.println(result); 17 }else { 18 System.out.println("請傳入由Date類或其子類建立的對象。"); 19 } 20 } 21 }