2017-02-04 48 views
0

我想了解instanceof如何工作。Java 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显示在控制台中。

+6

'a'是'A',因为'C extends B extends A'。 'a'是'B',因为'C扩展B'。 'a'是一个'C',因为它是。 'a'不是'D',因为'D扩展C'''''是'C'。 –

+0

感谢您的帮助。 –

+0

我在提出这个问题来补救反对票。 –

回答

1

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

这意味着,你可以做这样的事情B b = new C();,因为C是B的一个子类,因此的C每个实例也是B的实例

想起那些为matrioska娃娃。每个内在的娃娃都是一个超级类别,而外层是一个派生类。

每次你实例化一个特定类型的对象时,你复制了这个玩偶,但是为了复制一个大玩偶,你还必须复制里面的小玩偶。

同样的方法,你可以把对象想象成一个内存块,它拥有一切都在它的类中,再加上一切都在它的超类中,等等,直到你到达Object类。

+1

这是_very_ unlear。 “_instance of C也是C_的实例” - 什么? “_instantiate某种类型的对象,你复制娃娃_” - 什么? –

+0

第一个是我现在纠正的类型。第二个是类比,可能不是我以最佳方式表达的,但它应该起作用。 – bracco23

1

由于C延伸BB延伸CainstanceofA

由于C延伸BainstanceofB

重要的是ainstanceofC

让我把它放到上下文中。假设您有三个class es,Animal,CarnvorousAnimalLionCarnivorousAnimal extends AnimalLion extends CarnivorousAnimal。当你实例化一个Lion时,你的Lion将是一个instanceofLion平凡,但它将是一个instanceofCarnivorousAnimal,因为每个Lion也是CarnivorousAnimal。由于您的对象是CarnivorousAnimal,因此它也将是Animal,因为每个CarnivorousAnimal也是Animal

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

1

如前所述here

子类型的一个目的也是一种类型的父类的。

的Java规则是

一个超类参考变量可以保存子类的对象。

所以你的A类持有B类的参考和类 B类是保持基准C.

Animal        Class A 

DomesticAnimal extends Animal  Class B extends A 

Dog extends DomesticAnimal   Class C extends B 

从上面的表格我们可以说狗是一种家畜,也是动物

的动物也是动物

简单地A类可以是A

+0

你可以upvote我(早先,相当)的答案,因为我已upvoted你的。 –

0

类的实例使用当与instanceof关键字返回trueObject所有的Java对象是instanceof Object.java因此,任何对象。这是因为所有的java类都是从Object.java派生的(所有的类都是隐式的sub claase或者Object.java类的子类)。

关键字instanceof

  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 inherits from ISpecial1ISpecial2,GrandParent,0 Parent,IParent,IGrandParentIChild因此instanceof对于Child.java的objcet对于所有上述类和接口(包括fir Child.java)都将评估为true。