簡體   English   中英

Java InstanceOf輸出

[英]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擴展BB擴展C ,因此aAinstanceof

由於C擴展BaBinstanceof

aCinstanceof是微不足道的。

讓我把它放到上下文中。 假設你有三個classAnimalCarnvorousAnimalLion CarnivorousAnimal extends AnimalLion 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

  1. 它的類的一個對象

  2. 以及所有上層父類

  3. 以及由對象類和類的上層次結構中的所有類實現的所有接口。 對於所有更高級別的接口(由實現的接口擴展的接口)也返回true

    public class GrandParent implements IGrandParent { .... }

    public class Parent implements IParent{ .... }

    public class Child implements IChild { .... }

    public interface IgrandParent extends ISpecial1,ISpecial2 { ..... }

現在我們看到Child.java inheritsISpecial1ISpecial2GrandParentParentIParentIGrandParentIChild ,因此instanceof為Child.java的objcet將評估為true,以上所有的類和接口,包括FIR Child.java。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM