java instanceof 繼承_Java中的instanceof關鍵字

Java中,instanceof運算符的前一個操作符是一個引用變量,后一個操作數通常是一個類(可以是接口),用于判斷前面的對象是否是后面的類,或者其子類、實現類的實例。如

果是返回true,否則返回false。

也就是說:

使用instanceof關鍵字做判斷時, instanceof 操作符的左右操作數必須有繼承或實現關系

下面我們用繼承樹來判斷instanceof的返回值:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 19:557 * @Describe 繼承樹來判斷instanceof的返回值8 */

9 interfaceMan{}10 class Person1 implementsMan{}11 class Student extendsPerson1{}12 class Postgraduate extendsStudent {}13 classAnimal {}14 public classMain1 {15 public static voidmain(String[] args) {16 System.out.println("Student 的對象是誰的實例?");17 instanceofTest(newStudent());18 System.out.println("Animal 的對象是誰的實例?");19 instanceofTest(newAnimal());20 System.out.println("Postgraduate 的對象是誰的實例?");21 instanceofTest(newPostgraduate());22 //一個類的實例是這個類本身的實例,也是他父類,父類的父類的實例,也是實現的接口的實例

23 }24

25 public static voidinstanceofTest(Object p) {26 if (p instanceofAnimal)27 System.out.println(p.getClass() + "類的實例 是類Animal的實例");28 if (p instanceofPostgraduate)29 System.out.println(p.getClass() + "類的實例 是類Postgraduate的實例");30 if (p instanceofStudent)31 System.out.println(p.getClass() + "類的實例 是類Student的實例");32 if (p instanceofPerson1)33 System.out.println(p.getClass() + "類的實例 是類Person的實例");34 if (p instanceofMan)35 System.out.println(p.getClass() + "類的實例 是接口Man的實例");36 if (p instanceofObject)37 System.out.println(p.getClass() + "類的實例 是類Object的實例");38 }39 }

上面的程序,展示各類之間的關系的繼承樹是:

e7c3739b67243b5825562fb6465de59f.png

上述程序中:

由上面繼承樹可知,某個類(接口也可以看成一個特殊的類)的對象是不是其他類(或接口)的實例,只需按箭頭方向,以此對象所在的類為起點到達此繼承樹分支(可能有多個分支)終點,沿途經過的類(包括本類,或接口)就都是該對象的實例。

所以輸出結果是:

c756e367c8cd0671371b21331d9b1523.png

但是,要注意一點:

在判斷某個類(接口也可以看成一個特殊的類)的對象是不是其他類(或接口)的實例,一定要首先進行向上轉型,然后才可用instanceof關鍵字進行判斷,這是基本操作規范。

如:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 20:027 * @Describe8 */

9

10 interfaceA{11 voidsay();12 }13

14 class B implementsA{15 public voidsay()16 {17 System.out.println("B實現的say()方法");18 }19 }20

21 class C implementsA{22 public voidsay()23 {24 System.out.println("C實現的say()方法");25 }26 }27

28 public classMain2 {29 public static voidmain(String[] args) {30 A a= new B(); //接口不能new

31 System.out.println(a instanceof B); //true;發生了A a= new B();

32 System.out.println(a instanceof C); //false;沒有發生A a = new C();

33 }34 }

運行結果:

b34eb157cda416b0b3161da1ac668246.png

以上各類的之間關系的繼承樹如下:

05c9671a7a1afef5ee138f8f5fa59b16.png

在判斷接口A的對象a 是不是類C的實例時,沒有先進行向上轉型,就進行instanceof關鍵字的使用了,是肯定會返回false的。

測試用例:

1 packageinstanceofTest;2

3 /**

4 *@authorzsh5 * @company wlgzs6 * @create 2019-03-21 20:077 * @Describe instanceof 測試用例8 */

9 interfaceA{10

11 }12 class B implementsA{13

14 }15 class C extendsB{16

17 }18 public classMain3 {19 public static voidmain(String[] args) {20 A ab=newB();21 A ac=newC();22 B bc=newC();23 B bb=newB();24 C cc=newC();25 //對象實現一個接口,用這個對象和這個接口進行instanceof判斷,都為true。

26 System.out.println("ab instanceof A="+(ab instanceofA));27 System.out.println("ac instanceof A="+(ac instanceofA));28 System.out.println("bc instanceof A="+(bc instanceofA));29 System.out.println("bb instanceof A="+(bb instanceofA));30 System.out.println("cc instanceof A="+(cc instanceofA));31 //對象和父類進行instanceof判斷,都為true

32 System.out.println("ab instanceof B="+(ab instanceofB));33 System.out.println("ac instanceof B="+(ac instanceofB));34 System.out.println("bc instanceof B="+(bc instanceofB));35 System.out.println("bb instanceof B="+(bb instanceofB));36 System.out.println("cc instanceof B="+(cc instanceofB));37 //對象和他的子類進行instanceof判斷為false

38 System.out.println("ab instanceof C="+(ab instanceofC));39 System.out.println("ac instanceof C="+(ac instanceofC));40 System.out.println("bc instanceof C="+(bc instanceofC));41 System.out.println("bb instanceof C="+(bb instanceofC));42 System.out.println("cc instanceof C="+(cc instanceofC));43 }44 }

運行結果:

088a1b257dbea4c4b1607a6e575ecee5.png

總結:

如果一個類的實例是這個類本身的實例,那么它也是它的父類、它的父類的父類的實例,也是由它實現的接口的實例

且instanceof左邊操作元顯式聲明的類型與右邊操作元必須是同種類或右邊是左邊父類的繼承關系

此外:

//false;這是instanceof 特 有 的 規 則 : 若左操作數為null, 結果就直接返回false, 不再運算右操作數是什么類。

boolean b5 = null instanceof String;

//編譯不通過;'A'在此處視為基本數據類型char,instanceof操作符只能用作對象的判斷

boolean b4 = 'A' instanceof Character;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中文導致Mybatis無效的列索引

<!-- 普鐵 --><select id"selectTrainSceneThrough" parameterType"HashMap" resultType"HashMap">select ROUND(("普鐵用戶專網總流量KB""普鐵用戶公網總流量KB")/1024/1024,3) as total_dataflow,"普鐵用…

python怎么創建配置文件_如何寫python的配置文件

一、創建配置文件在D盤建立一個配置文件&#xff0c;名字為&#xff1a;test.ini內容如下&#xff1a;[baseconf]host127.0.0.1port3306userrootpasswordrootdb_namegloryroad[test]ip127.0.0.1int1float1.5boolTrue注意&#xff1a;要將文件保存為ansi編碼&#xff0c;utf-8編…

學習筆記-JMeter 進行接口壓力測試

一、壓力測試場景設置 1、場景設定&#xff1a;進行接口壓力測試時&#xff0c;有單場景也有混合場景。單場景就是對一個接口進行請求&#xff1b;混合場景需要對多個接口進行請求&#xff0c;在流程類業務場景會運用到 2、壓測時間設定&#xff1a;通常時間為10&#xff0d;15…

Linux的 .bashrc 和.bash_profile和.profile文件

linux啟動或是每次打開一個shell的時候都會執行用戶家目錄下的.bashrc文件&#xff0c;所有可以在這個文件里面添加一些內容&#xff0c;以便Linux每次啟動時都會執行相應的內容。 如果ssh方式遠程登錄Linux時&#xff0c;會自動執行用戶家目錄下的.bash_profile文件&#xff0…

四宮格效果 css_【深度教研】智力游戲“九宮格” 集體教研活動紀實

【關鍵詞】教研要建立過程模式&#xff0c;規范管理&#xff0c;分層推進&#xff0c;各負其責&#xff0c;及時反饋&#xff0c;展示總結。讓教研的過程成為全體教師共同成長的過程。游戲和材料不是一次性的制作和一次性的使用&#xff0c;其價值在于反復玩&#xff0c;玩中學…

java oracle 排序_Oracle的排序和限制條件(order by 和where)

1、Order by子句的使用select column....from ....order by ...1) Order by子句在整個select語句中的位置&#xff1a;始終位于最后2) order by后可以跟什么&#xff1a;列名&#xff0c;列的別名&#xff0c;表達式&#xff0c;列出現在select關鍵字后的順序(列號);3) order b…

kettle使用_ETL工具(kettle)-《PentahoKettle解決方案-使用PDI構建開源ETL解決方案》

&#xfeff;Matt Casters的博客:http://www.ibridge.be/、 www.kettle.be書籍:《Pentaho Kettle解決方案&#xff1a;使用PDI構建開源ETL解決方案》 鏈接&#xff1a;https://pan.baidu.com/s/15iUOWOCb8g_YLo5WN9fh0A 提取碼&#xff1a;5upfkettle起源Kettle一詞起源于“KDE…

Linux下chkconfig命令詳解

原文&#xff1a;http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html ------------------------------ chkconfig命令主要用來更新&#xff08;啟動或停止&#xff09;和查詢系統服務的運行級信息。謹記chkconfig不是立即自動禁止或激活一個服務&#xff0…

sql server numeric 可存幾位小數_CBA中的10大傳奇隊長,將籃球精神一直傳遞下去,你認識幾位呢?...

閱讀本文前&#xff0c;請您先點擊上面的藍色字體“十點聽情感”&#xff0c;再點擊“關注”&#xff0c;這樣您就可以繼續免費收到最新文章了。每天都有分享。完全是免費訂閱&#xff0c;請放心關注&#xff01;&#xff01;&#xff01;中國男子籃球職業聯賽簡稱CBA中國籃球自…

java searchterm_elasticsearch – 彈性搜索:“Term”,“Match Phrase”和“Query String”之間的差異...

術語查詢匹配單個術語&#xff0c;因為它是&#xff1a;不分析值。所以&#xff0c;它不必根據你索引的情況而降低。如果您在索引時間提供Bennett并且未分析該值&#xff0c;則以下查詢將不返回任何內容&#xff1a;{"query": {"term" : { "user"…

python批量刪除文件名_python批量刪除文件名中的未知字符

python批量刪除文件名中的未知字符如上圖所示&#xff0c;需要修改的文件名的個數超過500個&#xff0c;如果一個一個的刪除非常的費時間&#xff0c;現在用python修改很容易&#xff0c;方便又省時間&#xff0c;具體步驟如下1)首先根據自己需要修改的文件名編寫rename.py程序…

設置ntpdate服務開機啟動校驗時間

一般linux都預裝了 ntpdate 服務。 如果沒有安裝&#xff0c;參考博文&#xff1a;http://blog.csdn.net/zengmingen/article/details/52913486啟動設置 1、檢查系統服務里有沒有ntpdate 使用命令&#xff1a;chkconfig --list2、設置開機啟動 chkconfig 的命令詳見&#xff1a…

In Compiler.php line 36: Please provide a valid cache path.

/********************************************************************************** In Compiler.php line 36: Please provide a valid cache path.* 說明&#xff1a;* 安裝OpenSourceBikeShare過程中遇到的報錯&#xff0c;由于目前對這個東西不熟悉&#x…

現代控制會用到python嘛_Python 流程控制

Python流程控制1.順序結構我們寫的Python代碼都是一條一條語句順序執行&#xff0c;這種代碼結構通常稱之為順序結構。2.分支結構(if、elif、else語句)然而僅有順序結構并不能解決所有的問題&#xff0c;比如我們設計一個游戲&#xff0c;游戲第一關的通關條件是玩家獲得1000分…

java tar 安裝程序_linux下jdk的安裝(tar包)

1、查看jdk安裝路徑[rootlocalhost ~]# whereis javajava: /usr/bin/java /etc/java /usr/lib/java /usr/share/java /usr/share/man/man1/java.1.gz[rootlocalhost ~]# which java/usr/bin/java注&#xff1a;whereis:該指令會在特定目錄中查找符合條件的文件。這些文件應屬于…

電腦卡頓不流暢是什么原因_什么造成游戲直播畫畫卡頓、延遲?這三個原因了解一下...

原標題&#xff1a;什么造成游戲直播畫畫卡頓、延遲&#xff1f;這三個原因了解一下從事直播的朋友們相信都有所體會&#xff0c;直播時很容易出現畫面卡頓、延遲的現象&#xff0c;這究竟是什么原因造成的呢&#xff1f;最可能是這幾點&#xff01;1、服務器過載崩潰說起服務器…

中斷和中斷處理程序

1. 中斷 Linux內核要對連接到計算機上的所有硬件設備進行管理&#xff0c;首先要能和它們互相通信。從所周知&#xff0c;處理器的速度跟外圍硬件設備的速度往往不在一個數量級上。所以&#xff0c;需要一種機制&#xff0c;如果輪詢(polling)是一種解決辦法&#xff0c;可以讓…

Hadoop解決內存受限問題

因為NameNode的數據需要加載到內存里&#xff0c;隨著數據越來越大&#xff0c;內存會不夠用出現內存受限問題。 解決方法&#xff1a; 官網&#xff1a;hdfs聯邦 http://blog.csdn.net/zengmingen/article/details/52143300 國內&#xff1a; 因為數據存在階段性&#x…

python最簡分數_1062 最簡分數 Python實現

1062 最簡分數 (20 分)一個分數一般寫成兩個整數相除的形式&#xff1a;N/M&#xff0c;其中 M 不為0。最簡分數是指分子和分母沒有公約數的分數表示形式。現給定兩個不相等的正分數 N?1??/M?1?? 和 N?2??/M?2??&#xff0c;要求你按從小到大的順序列出它們之間分母…

java linux 調用32位so_從linux源碼看socket(tcp)的timeout

從linux源碼看socket(tcp)的timeout前言網絡編程中超時時間是一個重要但又容易被忽略的問題,對其的設置需要仔細斟酌。在經歷了數次物理機宕機之后,筆者詳細的考察了在網絡編程(tcp)中的各種超時設置&#xff0c;于是就有了本篇博文。本文大部分討論的是socket設置為block的情況…