繁体   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