我想了解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.
答案 0 :(得分:1)
事实上,某个类的每个引用都必须引用该类的对象实例。
这意味着您可以执行B b = new C();
之类的操作,因为C是B的子类,因此C的每个实例也是B的实例。
将这些视为matrioska娃娃。每个内部玩偶都是超类,外部是派生类。
每当你实例化一个特定类型的物体时,你都会复制玩偶,但要复制一个大玩偶,你还必须复制里面的小玩偶。
同样地,您可以将对象视为一个内存块,其中所有内容都在其类中,并且所有内容都在其超类中,依此类推,直到您升级到Object
类。
答案 1 :(得分:1)
由于C
延伸B
而B
延伸C
,a
为instanceof
A
。
由于C
延伸B
,a
为instanceof
B
。
a
是instanceof
C
,这是微不足道的。
让我把它放到上下文中。假设您有三个class
es,Animal
,CarnvorousAnimal
和Lion
。 CarnivorousAnimal extends Animal
和Lion extends CarnivorousAnimal
。当您实例化Lion
时,Lion
将instanceof
Lion
为instanceof
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
public class GrandParent implements IGrandParent {
....
}
public class Parent implements IParent{
....
}
public class Child implements IChild {
....
}
public interface IgrandParent extends ISpecial1,ISpecial2 {
.....
}
现在我们从inherits
,ISpecial1
,ISpecial2
,GrandParent
,Parent
,IParent
看到Child.java IGrandParent
和IChild
以及因此instanceof
对于所有上述类和接口,对于所有上面的类和接口,它将被评估为true,包括fir Child.java。