首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java InstanceOf输出

Java InstanceOf输出
EN

Stack Overflow用户
提问于 2017-02-04 10:54:19
回答 4查看 3.6K关注 0票数 1

我想了解一下这个例子是如何运作的。

考虑以下代码:

代码语言:javascript
复制
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会显示在控制台上。

EN

回答 4

Stack Overflow用户

发布于 2017-02-04 11:04:47

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

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

把它们想象成一个马托斯卡娃娃。每个内在玩偶都是一个超类,外层是一个派生类.

每次实例化特定类型的对象时,都会复制洋娃娃,但要复制大洋娃娃,还必须复制里面的较小的娃娃。

同样,您可以将对象看作是一个内存块,它的所有东西都在它的类中,加上所有东西都在它的超类中,依此类推,直到您进入Object类。

票数 1
EN

Stack Overflow用户

发布于 2017-02-04 11:15:24

由于C扩展了BB扩展了C,所以ainstanceof A

由于C扩展了B,所以a是一个instanceof B

a是一个instanceof C,这是微不足道的。

让我把它放在上下文中。假设您有三个classes,AnimalCarnvorousAnimalLionCarnivorousAnimal extends AnimalLion extends CarnivorousAnimal.当您实例化一个Lion时,您的Lion将是一个简单的instanceof Lion,但它将是一个instanceof CarnivorousAnimal,因为每个Lion都是一个CarnivorousAnimal。因为您的对象是一个CarnivorousAnimal,所以它也将是一个Animal,因为每个CarnivorousAnimal都是一个Animal

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

票数 1
EN

Stack Overflow用户

发布于 2017-02-04 12:05:08

如前所述,这里

子类类型的对象也是父类的类型。

java规则是

SuperClass引用变量可以保存SubClass对象。

你的A班指的是B班,B班是C班。

代码语言:javascript
复制
Animal                             Class A

DomesticAnimal extends Animal      Class B extends A

Dog extends DomesticAnimal         Class C extends B

从上表可以说狗是家畜也是动物

动物也是动物

简单地说,类A可以是A类的一个实例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42039503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档