动物是狗的超类,而狗有一种叫树皮的方法public void bark(){ System.out.println("woof");}考虑以下:Animal a = new Dog();if (a instanceof Dog){ a.bark();}会发生什么?不允许分配允许调用树皮,并在运行时打印“ woof”可以叫到树皮,但不打印任何内容调用树皮会导致编译时错误调用树皮会导致运行时错误我说2是因为我们正在检查物体是否是狗;因为dog是其中包含bark方法的类,如果是,则将其调用,它将打印出:s我的理解在这里正确吗?
3 回答
守着一只汪
TA贡献1872条经验 获得超3个赞
不,答案是;
4)调用树皮会导致编译时错误
树皮方法未定义为分配的动物类型的方法,因此将导致编译时问题;这可以通过铸造来解决;
((Dog)a).bark();
慕哥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是一种静态类型的语言,因此不允许这种类型的代码。
添加回答
举报
0/150
提交
取消