我想了解一下这个例子是如何运作的。
考虑以下代码:
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
}
}如果我错了,为了返回true,必须满足IS-A条件。在运行时,程序知道引用"a“表示的对象是C类型,因此,难道不应该只在//5行的条件中输出吗?为什么A和B也在输出中?
D不显示是因为对象不是D的实例,所以没有混淆。但我不明白为什么A和B会显示在控制台上。
发布于 2017-02-04 11:04:47
事实上,某个类的每个引用都必须引用对象实例到该类。
这意味着你可以做像B b = new C();这样的事情,因为C是B的一个子类,因此C的每个实例也都是B的实例。
把它们想象成一个马托斯卡娃娃。每个内在玩偶都是一个超类,外层是一个派生类.
每次实例化特定类型的对象时,都会复制洋娃娃,但要复制大洋娃娃,还必须复制里面的较小的娃娃。
同样,您可以将对象看作是一个内存块,它的所有东西都在它的类中,加上所有东西都在它的超类中,依此类推,直到您进入Object类。
发布于 2017-02-04 11:15:24
由于C扩展了B,B扩展了C,所以a是instanceof A。
由于C扩展了B,所以a是一个instanceof B。
a是一个instanceof C,这是微不足道的。
让我把它放在上下文中。假设您有三个classes,Animal,CarnvorousAnimal和Lion。CarnivorousAnimal extends Animal和Lion extends CarnivorousAnimal.当您实例化一个Lion时,您的Lion将是一个简单的instanceof Lion,但它将是一个instanceof CarnivorousAnimal,因为每个Lion都是一个CarnivorousAnimal。因为您的对象是一个CarnivorousAnimal,所以它也将是一个Animal,因为每个CarnivorousAnimal都是一个Animal。
当您扩展类时,您的子类将是一个更精确的规范。更具体的是它更一般的定义的实例,一个子集,如果你愿意的话。
发布于 2017-02-04 12:05:08
如前所述,这里
子类类型的对象也是父类的类型。
java规则是
SuperClass引用变量可以保存SubClass对象。
你的A班指的是B班,B班是C班。
Animal Class A
DomesticAnimal extends Animal Class B extends A
Dog extends DomesticAnimal Class C extends B从上表可以说狗是家畜,也是动物
动物也是动物
简单地说,类A可以是A类的一个实例
https://stackoverflow.com/questions/42039503
复制相似问题