“我说 2,因为我们正在检查对象是否是狗;因为 dog 是其中包含 bark 方法的类,如果是,那么我们称之为它将打印出:s”
你的理由是正确的,但这不是它的工作方式。
Java 是一种静态类型语言,这意味着对象可能响应的方法的有效性在编译时得到验证。
你可能会认为支票:
if( a instanceof Dog )
会做,但实际上并没有。编译器所做的是检查声明类型的“接口”(在这种情况下为 Animal )。“接口”由在 Animal 类上声明的方法组成。
如果bark()方法没有在超类Animal中定义,编译器会说:“嘿,这行不通”。
这很有帮助,因为“有时”我们在编码时会打错字(例如输入 barck() )
如果编译器没有对此发出警告,您将不得不在“运行时”找到它,并且并不总是带有明确的消息(例如 IE 中的 javascript 会说“意外对象”之类的内容)
尽管如此,像 java 这样的静态类型语言允许我们强制调用。在这种情况下,它使用“cast”运算符 ()
像这样
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 的调用导致编译时错误”
我希望这有帮助。