[英]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.