“我说2,因为我们正在检查对象是否为狗;因为狗是具有吠叫方法的类,如果是,我们将调用它,并打印出:s。”
您的理解是正确的,但这不是它的工作方式。
Java 是一种静态类型语言,这意味着对象可能响应的方法的有效性在编译时进行验证。
您可能认为检查:
if( a instanceof Dog )
可以这样做,但实际上并不行。编译器所做的是检查声明类型(在此情况下为 Animal)的“接口”。该“接口”由在 Animal 类上声明的方法组成。
如果在超类 Animal 中未定义 bark() 方法,则编译器会说:“嘿,那行不通。”
这很有帮助,因为“有时候”我们在编码时会出现拼写错误(例如,打 barck() 而不是 bark())
如果编译器没有警告我们,您将不得不在“运行时”找到它,并且不总是有清晰的消息(例如,IE 中的 javascript 会显示“意外对象”之类的内容)
尽管如此,像 Java 这样的静态类型语言仍然允许我们强制调用。在这种情况下,使用“转换”运算符 ()
像这样
1. Animal a = new Dog();
2. if (a instanceof Dog){
3. Dog imADog = ( Dog ) a;
4. imADog.bark();
5. }
在第3行中,您正在进行“转换”为Dog类型,以便编译器可以检查bark是否是有效的消息。
这是对编译器的指示,表示“嘿,我是程序员,在这里我知道我在做什么”。编译器会检查,好的,狗可以接收bark()消息,继续执行。但是,如果在运行时动物不是狗,则会引发运行时异常。
转换也可以缩写为:
if( a instanceof Dog ) {
((Dog)a).bark();
}
这将会运行。
因此,正确答案是4:“调用bark导致编译时错误”
希望这可以帮到你。
a
是否是Dog;只要当该行被执行时,a
有一个bark
方法,它就可以工作。 - Michael Myers