为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在超类对象上调用子类的方法?

是否可以在超类对象上调用子类的方法?

九州编程 2019-11-02 13:34:06
动物是狗的超类,而狗有一种叫树皮的方法public void bark(){    System.out.println("woof");}考虑以下:Animal a = new Dog();if (a instanceof Dog){    a.bark();}会发生什么?不允许分配允许调用树皮,并在运行时打印“ woof”可以叫到树皮,但不打印任何内容调用树皮会导致编译时错误调用树皮会导致运行时错误我说2是因为我们正在检查物体是否是狗;因为dog是其中包含bark方法的类,如果是,则将其调用,它将打印出:s我的理解在这里正确吗?
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

由于Animal没有称为bark的方法,因此无法编译。这样想,所有的狗都是动物,但并非所有的动物都是狗。所有的狗都吠叫,但不是所有的动物都吠叫。


查看完整回答
反对 回复 2019-11-02
?
守着一只汪

TA贡献1872条经验 获得超3个赞

不,答案是;


4)调用树皮会导致编译时错误


树皮方法未定义为分配的动物类型的方法,因此将导致编译时问题;这可以通过铸造来解决;


((Dog)a).bark();


查看完整回答
反对 回复 2019-11-02
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

密钥在以下行中:


Animal a = new Dog();

尽管Dog创建了一个新实例,但其引用a被声明为类型Animal。因此,所有对的引用a都将new Dog作为处理Animal。


因此,除非Animal具有bark方法,否则以下行将导致编译器错误:


a.bark();

即使a经过测试是否是它的实例Dog并a instanceof Dog实际返回true,该变量a仍然是类型的Animal,因此if语句内的块仍然a作为变量处理Animal。


这是静态类型语言的功能,在这种类型中,变量会提前分配类型,然后在编译时检查类型是否匹配。如果此代码是在动态类型的语言(在运行时检查类型)上执行的,则可以允许以下内容:


var a = new Dog();

if (a instanceof Dog)

    a.bark();

a.bark()只能在实例为时执行Dog,因此对的调用bark将始终有效。但是,Java是一种静态类型的语言,因此不允许这种类型的代码。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 519 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信