Java基礎:關鍵字 instanceof

 

java中,instanceof運算符的前一個操作符是一個引用變量,後一個操作數通常是一個類(可以是接口),用於判斷前面的對象是否是後面的類,或者其子類、實現類的實例。如果是返回true,否則返回false。

也就是說:使用instanceof關鍵字做判斷時, instanceof 操作符的左右操作數必須有繼承或實現關係

instanceof是Java中的二元運算符,左邊是對象,右邊是類;當對象是右邊類或子類所創建對象時,返回true;否則,返回false。

  • 類的實例包含本身的實例,以及所有直接或間接子類的實例
  • instanceof左邊顯式聲明的類型與右邊操作元必須是同種類或存在繼承關係,也就是說需要位於同一個繼承樹,否則會編譯錯誤
     

左邊的對象實例不能是基礎數據類型 

左邊的對象實例和右邊的類不在同一個繼承樹上

null用instanceof跟任何類型比較時都是false

 

繼承樹來判斷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();      
    }
}

如果一個類的實例是這個類本身的實例,那麼它也是它的父類、它的父類的父類的實例,也是由它實現的接口的實例
且instanceof左邊操作元顯式聲明的類型與右邊操作元必須是同種類或右邊是左邊父類的繼承關係

對於instanceof關鍵字來說,其左邊一定要是個引用類型的變量

boolean b5 = null instanceof String; 
//false;這是instanceof 特有的規則:若左操作數爲null, 結果就直接返回false, 不再運算右操作數是什麼類。
boolean b4 = 'A' instanceof Character; 
//編譯不通過;'A'在此處視爲基本數據類型char,instanceof操作符只能用作對象的判斷

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章