instanceof運算符與引用變數的強制類型轉換

来源:https://www.cnblogs.com/bingyimeiling/archive/2019/09/11/11508783.html
-Advertisement-
Play Games

一、instanceof運算符 instanceof是Java語言中的一個二元運算符,它的作用是判斷一個引用類型的變數所指向的對象是否是一個類(或介面、抽象類、父類)的實例,即它左邊的對象是否是它右邊的類的實例該運算符返回boolean類型的數據。 常見的用法為:result=object inst ...


一、instanceof運算符

instanceof是Java語言中的一個二元運算符,它的作用是判斷一個引用類型的變數所指向的對象是否是一個類(或介面、抽象類、父類)的實例,即它左邊的對象是否是它右邊的類的實例該運算符返回boolean類型的數據。

常見的用法為:result=object instanceof class。如果object是clas的一個實例,那麼instanceof運算符返回true;如果object不是class的一個實例,或者object是null,那麼instanceof運算符返回false。

在使用instanceof運算符時需要註意:instanceof運算符前面操作數的編譯時類型要麼與後面的類相同,要麼與後面的類具有父子繼承關係,否則會引起編譯錯誤。下麵的程式示範了instanceof運算符的用法。

public class InstanceofTest {

    public static void main(String[] args) {
        //聲明hello時使用Object類,則hello的編譯類型是Object
        //Object是所有類的父類,但hello變數的實際類型是String
        Object hello = "hello";
        //String與Object類存在繼承關係,可以進行instanceof運算,返回true
        System.out.println("字元串是否是Object類的實例:"+(hello instanceof Object));
        System.out.println("字元串是否是String類的實例:"+(hello instanceof String));
        //Math與Object類存在繼承關係,可以進行instanceof運算,返回false
        System.out.println("字元串是否是Math類的實例:"+(hello instanceof Math));
        //String類實現了Comparable介面,所以返回true
        System.out.println("字元串是否是Comparable類的實例:"+(hello instanceof Comparable));
        String a = "hello";
        //String與Math類沒有繼承關係,所以下麵代碼編譯無法通過
        System.out.println("字元串是否是Math類的實例:"+(a instanceof Math));

    }

}

上面程式通過Object hello = "hello";代碼定義了一個hello變數,這個變數的編譯時類型是Object類,但實際類型是String。因為Object類是所有類、介面的父類,因此可以執行hello instanceof String和hello instanceof Math等。

但如果使用String a = "hello";代碼定義的變數a,就不能執行a instanceof Math,因為a的編譯類型是String,String類型既不是Math類型也不是Math類型的父類,所以這行代碼編譯就會出錯。

instanceof運算符的作用是:在進行強制類型轉換之前,首先判斷前一個對象是否是後一個類的實例,是否可以成功轉換,從而保證代碼更加健壯。


 二、引用變數的強制類型轉換

編寫java程式時,引用變數只能調用它編譯時類型的方法,而不能調用它運行時類型的方法,即使它實際所引用的對象確實包含該方法。如果需要讓這個引用變數調用它運行時類型的方法,則必須把它強制類型轉換成運行時類型,強制類型轉換需要藉助於類型轉換運算符。

類型轉換運算符是小括弧,其用法是:(type)variable,這種用法可以將variable變數轉換成一個type類型的變數。除此之外,這個類型轉換運算符還可以將一個引用類型變數轉換成其子類類型。但這種強制類型轉換不是萬能的,需要註意以下兩點:

1)基本類型之間的轉換隻能在數值類型之間進行,這裡所說的數值類型包括整型、字元型和浮點型。但數值類型和布爾類型之間不能進行類型轉換。

2)引用類型之間的轉換隻能在具有繼承關係的兩個類型之間進行,如果是兩個沒有任何繼承關係的類型,則無法進行類型轉換,否則編譯時會出現錯誤。

下麵是進行強制類型轉換的示範程式,說明瞭哪些情況可以進行類型轉換,哪些情況不可以進行類型轉換。

 

public class ConversionTest {

    public static void main(String[] args) {
        double d = 13.4;
        long l = (long)d;
        System.out.println(l);
        int in = 5;
        //boolean b = (boolean)in;//編譯出錯
        Object obj = "hello";
        String str = (String)obj;//運行通過
        System.out.println(str);
        Object objPri = new Integer(5);
        String s = (String)objPri;//引發ClassCastException異常

    }

}

考慮到進行強制類型轉換時可能出現異常,因此進行類型轉換之前應先通過instanceof運算符來判斷是否可以成功轉換,例如上面的String s = (String)objPri,為了讓程式更加健壯,可以將代碼改為以下:

if(objPri instanceof String) {
    String s = (String)objPri;
}

instanceof和(type)是java提供的兩個相關的運算符,通常先用instanceof判斷一個對象是否可以強制類型轉換,然後再使用(type)運算符進行強制類型轉換,從而保證程式不會出現錯誤。

 

歡迎關註微信公眾號【Java典籍】,收看更多Java技術乾貨!

   ▼微信掃一掃下圖↓↓↓二維碼關註

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何逃離令人抓狂的 if-else 參數校驗的代碼,Van 帶你用validator快速搞定,節省更多的時間勾搭小姐姐。 ...
  • 原文再續,書接上一回 上回講到了,python IDLE的草稿本和作業本,並順便試了試python的輸入輸出,變數,運算的體驗,大家應該能感受到python的簡單了吧。 下麵我們繼續體驗python的強大,python之所以強大,是因為python有庫。(就如同人一樣學會了穿褲子也變得強大了) 課程 ...
  • 房天下 登錄 本次爬取的網址為: 一、分析請求 輸入用戶名和密碼,點擊登錄按鈕 請求的參數為: 就是輸入的用戶名, 是將密碼加密後的數據。我們只要找出密碼的加密方式就可以模擬登錄了。 二、密碼加密方式破解 這次我們以 作為關鍵字,進行搜索 找到加密位置之後,我們打上斷點,重新點擊登錄 找到密碼加密的 ...
  • 內容來自轉載整理 1.NumPy數值計算 NumPy是使用Python進行科學計算的基礎包,Numpy可以提供數組支持以及相應的高效處理函數,是Python數據分析的基礎,也是SciPy、Pandas等數據處理和科學計算庫最基本的函數功能庫,且其數據類型對Python數據分析十分有用。它包含: 一個 ...
  • 面試題 如何設計一個高併發系統? 面試官心理分析 說實話,如果面試官問你這個題目,那麼你必須要使出全身吃奶勁了。為啥?因為你沒看到現在很多公司招聘的 JD 里都是說啥,有高併發就經驗者優先。 如果你確實有真才實學,在互聯網公司里乾過高併發系統,那你確實拿 offer 基本如探囊取物,沒啥問題。面試官 ...
  • 前言 先列出java併發涉及的知識點,後面再慢慢補. java併發 1 常見概念 進程:程式執行的實體,操作系統資源調度資源分配的基本單元 線程:程式執行的最小單元,擁有獨立的堆棧和局部變數等屬性,可以共用進程的資源 同步是串列執行,阻塞 非同步是並行執行,非阻塞 併發:多個任務交替執行 並行:多個任 ...
  • 學習Python的第一天,也是我第一次寫博客的一天,不怎麼會寫博客,也不怎麼會Python,也不怎麼會寫總結.在學Python的第一天發現自己腦子不是很好用,在學習過程中出現很多錯誤,錯誤錦集如下,哈哈哈哈,要加油.以後要註意不要再犯下麵的錯誤了,不然以後在工作中很難獨立完成,也容易出現很多錯誤,這 ...
  • 之前多篇文章從mysql的底層結構分析、sql語句的分析器以及sql從優化底層分析, 還有工作中常用的sql優化小知識點。面試各大互聯網公司必問的mysql鎖和事務隔離級別,這篇文章給你打神助攻,一飛衝天。 鎖定義 鎖是電腦協調多個進程或線程併發訪問某一資源的機制。 在資料庫中,除了傳統的計算資源 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...