[英]Java InstanceOf Output
我想了解instanceof的工作原理。
請考慮以下代碼:
class A { }
class B extends A { }
class C extends B { }
class D extends C { }
public class TestClass{
public static void main(String args[]){
B b = new C(); //1
A a = b; //2
if (a instanceof A) System.out.println("A"); //3
if (a instanceof B) System.out.println("B"); //4
if (a instanceof C) System.out.println("C"); //5
if (a instanceof D) System.out.println("D"); //6
}
}
糾正我,如果我錯了這里,為了instanceof來返回true,則IS-A的條件必須得到滿足。 如果你看一下// 1行。 在運行時,程序知道由引用“a”表示的對象是C類型。因此,不應僅僅在第5行的條件中輸入? 為什么A和B也在輸出中?
不顯示D是因為該對象不是D的實例,因此沒有混淆。 但我不明白為什么在控制台中顯示A和B.
事實上,某個類的每個引用都必須引用該類的對象實例。
這意味着你可以做B b = new C();
因為C是B的子類,所以C的每個實例也是B的實例。
把它們想象成一個matrioska娃娃。 每個內部玩偶都是超類,外部是派生類。
每當你實例化一個特定類型的對象時,你復制玩偶,但要復制一個大玩偶,你還必須復制里面的小玩偶。
同樣地,您可以將對象視為一個內存塊,其中所有內容都在其類中,而且所有內容都在其超類中,依此類推,直到您開始使用Object
類。
由於C
擴展B
而B
擴展C
,因此a
是A
的instanceof
。
由於C
擴展B
, a
是B
的instanceof
。
a
是C
的instanceof
是微不足道的。
讓我把它放到上下文中。 假設你有三個class
, Animal
, CarnvorousAnimal
和Lion
。 CarnivorousAnimal extends Animal
和Lion extends CarnivorousAnimal
。 當你實例化一個Lion
,你的Lion
將是一個instanceof
Lion
平凡,但是這將是一個instanceof
CarnivorousAnimal
,因為每個Lion
也是CarnivorousAnimal
。 由於你的物體是CarnivorousAnimal
,它也是Animal
,因為每個CarnivorousAnimal
都是Animal
。
擴展類時,子類將是更精確的規范。 更具體的是它更一般的定義的實例,如果你願意,它是一個子集。
如前所述這里
子類類型的對象也是一種父類。
java規則是
SuperClass引用變量可以保存SubClass的對象。
因此,您的A類持有B類參考,而B類持有C類參考。
Animal Class A
DomesticAnimal extends Animal Class B extends A
Dog extends DomesticAnimal Class C extends B
從上表可以看出, Dog是一種家畜 ,也是一種動物
動物也是動物
簡單地說, A類可以是A類的實例
所有java對象都是instanceof
Object.java因此當與instanceof
關鍵字一起使用時,任何Object都會為Object
返回true
。 這是因為所有java類都派生自Object.java(所有類都是隱式子類或Object.java類的子類)。
關鍵字instanceof
為true返回true
它的類的一個對象
以及所有上層父類
以及由對象類和類的上層次結構中的所有類實現的所有接口。 對於所有更高級別的接口(由實現的接口擴展的接口)也返回true
public class GrandParent implements IGrandParent { .... }
public class Parent implements IParent{ .... }
public class Child implements IChild { .... }
public interface IgrandParent extends ISpecial1,ISpecial2 { ..... }
現在我們看到Child.java inherits
自ISpecial1
, ISpecial2
, GrandParent
, Parent
, IParent
, IGrandParent
和IChild
,因此instanceof
為Child.java的objcet將評估為true,以上所有的類和接口,包括FIR Child.java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.