Java InstanceOf输出

时间:2017-02-04 10:54:19

标签: java inheritance instanceof

我想了解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.

4 个答案:

答案 0 :(得分:1)

事实上,某个类的每个引用都必须引用该类的对象实例。

这意味着您可以执行B b = new C();之类的操作,因为C是B的子类,因此C的每个实例也是B的实例。

将这些视为matrioska娃娃。每个内部玩偶都是超类,外部是派生类。

每当你实例化一个特定类型的物体时,你都会复制玩偶,但要复制一个大玩偶,你还必须复制里面的小玩偶。

同样地,您可以将对象视为一个内存块,其中所有内容都在其类中,并且所有内容都在其超类中,依此类推,直到您升级到Object类。

答案 1 :(得分:1)

由于C延伸BB延伸Cainstanceof A

由于C延伸Bainstanceof B

ainstanceof C,这是微不足道的。

让我把它放到上下文中。假设您有三个class es,AnimalCarnvorousAnimalLionCarnivorousAnimal extends AnimalLion extends CarnivorousAnimal。当您实例化Lion时,Lioninstanceof Lioninstanceof CarnivorousAnimal,但由于每Lion CarnivorousAnimal {1}}也是CarnivorousAnimal。由于您的对象是Animal,因此它也是CarnivorousAnimal,因为每个Animal也是<span class="line-breaker"> {{text}} </span> .line-breaker { white-space: pre-line; }

扩展类时,子类将是更精确的规范。更具体的是它更一般的定义的实例,如果你愿意的话,它是一个子集。

答案 2 :(得分:1)

如上所述here

  

子类类型的对象也是一种父类。

java规则是

  

SuperClass引用变量可以保存SubClass的对象。

所以你的A级是B级和B级的参考 B类持有C类参考。

Animal                             Class A

DomesticAnimal extends Animal      Class B extends A

Dog extends DomesticAnimal         Class C extends B

从上表我们可以说狗是家畜而且是动物

动物也是动物

只需 A类可以是A类的实例

答案 3 :(得分:0)

所有java对象都是instanceof Object.java因此,与instanceof关键字一起使用时,任何对象都会为true返回Object。这是因为所有java类都派生自Object.java(所有类都是隐式子类或Object.java类的子类)。

关键字instanceof对于

返回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 { ..... }

  4. 现在我们从inheritsISpecial1ISpecial2GrandParentParentIParent看到Child.java IGrandParentIChild以及因此instanceof对于所有上述类和接口,对于所有上面的类和接口,它将被评估为true,包括fir Child.java。