java中的instanceof關鍵字
java中,instanceof運算子的前一個操作符是一個引用變數,後一個運算元通常是一個類(可以是介面),用於判斷前面的物件是否是後面的類,或者其子類、實現類的例項。如果是返回true,否則返回false。
也就是說:
使用instanceof關鍵字做判斷時, instanceof 操作符的左右運算元必須有繼承或實現關係
下面我們用繼承樹來判斷instanceof的返回值:
interface Man{}
class Person1 implements Man{}
class Student extends Person1 {}
class Postgraduate extends Student {}
class Animal {}
public class Ex_instanceOf
{
public static void main(String[] args) {
System.out.println("Student 的物件是誰的例項?");
instanceofTest(new Student());
System.out.println("Animal 的物件是誰的例項?");
instanceofTest(new Animal());
System.out.println("Postgraduate 的物件是誰的例項?");
instanceofTest(new Postgraduate());
//一個類的例項是這個類本身的例項,也是他父類,父類的父類的例項,也是實現的介面的例項
}
public static void instanceofTest(Object p) {
if (p instanceof Animal)
System.out.println(p.getClass() + "類的例項 是類Animal的例項");
if (p instanceof Postgraduate)
System.out.println(p.getClass() + "類的例項 是類Postgraduate的例項");
if (p instanceof Student)
System.out.println(p.getClass() + "類的例項 是類Student的例項");
if (p instanceof Person1)
System.out.println(p.getClass() + "類的例項 是類Person的例項");
if (p instanceof Man)
System.out.println(p.getClass() + "類的例項 是介面Man的例項");
if (p instanceof Object)
System.out.println(p.getClass() + "類的例項 是類Object的例項");
}
}
上面的程式,展示各類之間的關係的繼承樹是:
上述程式中:
由上面繼承樹可知,某個類(介面也可以看成一個特殊的類)的物件是不是其他類(或介面)的例項,只需按箭頭方向,以
此物件所在的類為起點到達此繼承樹分支(可能有多個分支)終點,沿途經過的類(包括本類,或介面)就都是該物件的例項。
所以輸出結果是:
Student 的物件是誰的例項?
class t20170722FromInternet.Student類的例項 是類Student的例項
class t20170722FromInternet.Student類的例項 是類Person的例項
class t20170722FromInternet.Student類的例項 是介面Man的例項
class t20170722FromInternet.Student類的例項 是類Object的例項
Animal 的物件是誰的例項?
class t20170722FromInternet.Animal類的例項 是類Animal的例項
class t20170722FromInternet.Animal類的例項 是類Object的例項
Postgraduate 的物件是誰的例項?
class t20170722FromInternet.Postgraduate類的例項 是類Postgraduate的例項
class t20170722FromInternet.Postgraduate類的例項 是類Student的例項
class t20170722FromInternet.Postgraduate類的例項 是類Person的例項
class t20170722FromInternet.Postgraduate類的例項 是介面Man的例項
class t20170722FromInternet.Postgraduate類的例項 是類Object的例項
但是,要注意一點:
在判斷某個類(介面也可以看成一個特殊的類)的物件是不是其他類(或介面)的例項,一定要首先進行向上轉型,然後才可用instanceof關鍵字進行判斷,這是基本操作規範。
如:
interface A{
void say();
}
class B implements A{
public void say()
{
System.out.println("B實現的say()方法");
}
}
class C implements A{
public void say()
{
System.out.println("C實現的say()方法");
}
}
public class TestDemo{
public static void main(String[] args) {
A a= new B(); //介面不能new
System.out.println(a instanceof B); //true;發生了A a= new B();
System.out.println(a instanceof C); //false;沒有發生A a = new C();
}
}
以上各類的之間關係的繼承樹如下:
在判斷介面A的物件a 是不是類C的例項時,沒有先進行向上轉型,就進行instanceof關鍵字的使用了,是肯定會返回false的。
總結:
如果一個類的例項是這個類本身的例項,那麼它也是它的父類、它的父類的父類的例項,也是由它實現的介面的例項
且instanceof左邊操作元顯式宣告的型別與右邊操作元必須是同種類或右邊是左邊父類的繼承關係
此外:
boolean b5 = null instanceof String; //false;這是instanceof 特 有 的 規 則 : 若左運算元為null, 結果就直接返回false, 不再運算右運算元是什麼類。
boolean b4 = 'A' instanceof Character; //編譯不通過;'A'在此處視為基本資料型別char,instanceof操作符只能用作物件的判斷
相關文章
- Java 中 instanceof 關鍵字 object instanceof ClassJavaObject
- java中this關鍵字Java
- java中的static關鍵字Java
- Java中final關鍵字Java
- Java中transient關鍵字的作用Java
- java中static關鍵字的作用Java
- 在Java中this關鍵字的使用Java
- Java中的各種關鍵字Java
- Java中this與super關鍵字Java
- java中的static和final關鍵字Java
- Java中final關鍵字如何使用?Java
- Java 的 static 關鍵字Java
- 深入理解Java中的volatile關鍵字Java
- 併發系列之「Java中的synchronized關鍵字」Javasynchronized
- JAVA面試題 淺析Java中的static關鍵字Java面試題
- [java]transient關鍵字Java
- Java native關鍵字Java
- Java Final關鍵字Java
- Java關鍵字volatile的理解Java
- Java面試題:請談談Java中的volatile關鍵字?Java面試題
- Java 中的 transient 關鍵字和物件序列化Java物件
- Java 中 final 關鍵字有什麼用Java
- Java volatile關鍵字作用Java
- Java volatile關鍵字解析Java
- Java 關鍵字之 finalJava
- Java關鍵字(八)——synchronizedJavasynchronized
- mysql 中的explain關鍵字MySqlAI
- [java基礎]之JAVA關鍵字Java
- 深入瞭解 Java 的 volatile 關鍵字Java
- 被遺忘的Java關鍵字:transientJava
- java基礎-關鍵字finalJava
- Java™ 教程(使用super關鍵字)Java
- Java併發--final關鍵字Java
- Java進階——super關鍵字Java
- 完全理解JavaScript中的this關鍵字JavaScript
- C++中的 const 關鍵字C++
- 說說iOS中的常用的關鍵字static ,class(僅限Swift關鍵字)iOSSwift
- Java 中你絕對沒用過的一個關鍵字?Java