猿问

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

动物是狗的超类,而狗有一种叫树皮的方法


public void bark()

{

    System.out.println("woof");

}

考虑以下:


Animal a = new Dog();

if (a instanceof Dog){

    a.bark();

}

会发生什么?


不允许分配

允许调用树皮,并在运行时打印“ woof”

可以叫到树皮,但不打印任何内容

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

调用树皮会导致运行时错误

我说2是因为我们正在检查物体是否是狗;因为dog是其中包含bark方法的类,如果是,则将其调用,它将打印出:s


我的理解在这里正确吗?


九州编程
浏览 536回答 3
3回答

神不在的星期二

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

守着一只汪

不,答案是;4)调用树皮会导致编译时错误树皮方法未定义为分配的动物类型的方法,因此将导致编译时问题;这可以通过铸造来解决;((Dog)a).bark();

慕哥6287543

密钥在以下行中: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是一种静态类型的语言,因此不允许这种类型的代码。
随时随地看视频慕课网APP

相关分类

Java
我要回答