Jakartase_— 深刻理解 instanceof(附)

1、前言

  • 1.一、instanceof 是 Java 的保留關鍵字,一個二元操做符(和==,>,<是同一類東東)
  • 1.二、做用:測試它左邊的對象是不是它右邊的類的實例
  • 1.三、返回值:返回 boolean 的數據類型。
  • 接下來經過本文給你們介紹Java 中的instanceof用法詳解及instanceof是什麼意思,須要的朋友參考下吧

2、instanceof 的說明、解釋

2.一、說明:

  •  (1). 一個類的實例包括自己的實例, 以及全部直接或間接子類的實例
  • (2). instanceof左邊操做元顯式聲明的類型與右邊操做元必須是同種類或有繼承關係, 即位於繼承樹的同一個分支上, 不然會編譯出錯 !

2.二、demo

  • 2.2.1_demo01_測試

    double obj = 1;
     if (obj instanceof Double)
         System.out.println("true");      //無輸出-->不成立
    • 編譯信息: Incompatible conditional operand types double and Double錯誤code

      • 分析: obj 必須是對象的實例。不能是基礎數據類型。
  • 2.2.2_demo02_對象

    String obj = 1.0 + "";
     if (obj instanceof Double)
         System.out.println("true");    //無輸出:
    • 編譯信息:Incompatible conditional operand types String and Double" 錯誤繼承

      • 分析:String 和 Double 不是位於繼承樹的同一個分支上。 
  • 2.2.3_demo03_token

    if(null instanceof Object)
         System.out.println("true");    
     else
         System.out.println("false");
     //輸出:false
     String obj = null;
     
     if (obj instanceof Object){
         System.out.println("true");
     else
         System.out.println("false");
     //輸出:false
    • 分析:null用操做符instanceof測試任何類型時都是返回false的接口

  • 2.2.4_demo04_編譯器

    String obj = null;
     if (obj instanceof null)
         System.out.println("true");
     else
         System.out.println("false");
    • 編譯信息:Syntax error on token "null", invalid ReferenceType" 標記"null"上的語法錯誤,無效引用類型it

  • 2.2.5_demo05_:前方高能,務必仔細閱讀!!!io

    class Student {}
     public class Test {
         public static void main(String[] args){
              //第1組
              System.out.println(new Student() instanceof String);    //編譯時錯誤
              System.out.println(new Student() instanceof Exception); //編譯時錯誤
              System.out.println(new Student() instanceof Object);   //輸出時true
              //第2組
              System.out.println(new Student() instanceof List);    //輸出false
              System.out.println(new Student() instanceof List<?>); //輸出false
              System.out.println(new Student() instanceof List<String>); //編譯錯誤
              System.out.println(new Student() instanceof List<Object>); //編譯錯誤
              //第3組
              System.out.println(new String() instanceof List);    //編譯錯誤
              System.out.println(new String() instanceof List<?>); //編譯錯誤
              //第4組
              System.out.println(null instanceof Object);      //輸出錯誤,同demo03
        }
     }
    • 分析:編譯

      • 對於第1組:與下面一塊兒論述
      • 對於第2組:

        • 疑惑1:爲何用student()測試String時編譯報錯,測試List的時編譯經過

          • 猜想:(1)難道是instanceof對接口在編譯時不做檢查呢,(2)仍是因爲List類型自己在編譯時不肯定具體類型致使的
          • 推翻猜想:與第3組用 String對象測試List<>和List<?>時結果大不相同
          • 論據:翻看Java書籍時發現:instanceof 的這些表現都是跟cast操做符是有點關係的,就是說當咱們在instanceof方法時,編譯器會檢查這個對象可以cast到右邊的類型。若是不能cast則直接報錯,若是不能肯定類型,則經過編譯,具體看運行時定。
        • 疑惑2:Student已經肯定類型了啊,List類型也是肯定的啊,爲何可以編譯經過呢,而String卻不行呢?``

          • 猜想:難道是本身定義的類和系統定義的類在編譯處理上有不一樣?
          • 推論:多是由於final關鍵字的區別形成的,咱們發現不論String、Integer、Long等都是最終類,他們的處理相似於編譯器對常量的處理,故而能夠經過編譯
          • 論據:其實當咱們在自定義的類前面加上final關鍵字的時候,其表現就跟String、Integer、Long這些最終類測試instanceof表現的同樣了。

3、instanceof 的用法

3.一、 用法:

  • result = object instanceof class

3.二、 參數:

  • result:布爾類型值
  • object:類的對象
  • class: 對象類
  • 說明:若是 object 是 class 的一個實例,則 instanceof 運算符返回 true。若是 object 不是指定類的一個實例,或者 object 是 null,則返回 false。

4、綜述

  • 相信任何一個認真讀完以上內容的人都會對instanceof的用法、理解更加深入!
  • 但願做者的文章能夠被您採納!您的支持是做者堅持的無限動力!Thanks!
相關文章
相關標籤/搜索