Java enthuware OCAJP实例

Java enthuware OCAJP实例,java,instanceof,scjp,Java,Instanceof,Scjp,这是来自Enthuware的代码示例。 我不明白为什么第三个instanceof操作符(b instanceof Bird)的计算结果不是false,而是给我一个编译时错误。 还有-我不明白恩图瓦雷想解释什么 我得到的编译时错误是 java:16:错误:不可转换类型 if(b鸟的实例)System.out.println(“f是鸟”); ^ 必填项:伯德 发现:蝙蝠 1 errorinstanceof操作符仅当对象通过某种继承链接并抛出错误时才计算true或false,否则将抛出错误第三个条件给

这是来自Enthuware的代码示例。 我不明白为什么第三个instanceof操作符(b instanceof Bird)的计算结果不是false,而是给我一个编译时错误。 还有-我不明白恩图瓦雷想解释什么

我得到的编译时错误是

java:16:错误:不可转换类型

if(b鸟的实例)System.out.println(“f是鸟”); ^

必填项:伯德

发现:蝙蝠


1 error

instanceof操作符仅当对象通过某种继承链接并抛出错误时才计算true或false,否则将抛出错误

第三个条件给出编译时错误,因为Bat不会扩展到Bird,第二个原因是Java类最多只能扩展一个类,Bat的子类不可能扩展到Bird类,基于这一规则,JVM足够聪明,能够发现Bat不可能是一只鸟。

下面的链接对您的问题有很好的解释。
interface Flyer{ }  
class Bird implements Flyer { }  
class Eagle extends Bird { }  
class Bat { }  

public class TestClass {  

public static void main(String[] args) {  
    Flyer f = new Eagle();  
    Eagle e = new Eagle();  
    Bat b = new Bat();  

    if(f instanceof Flyer) System.out.println("f is a Flyer");  
    if(e instanceof Bird) System.out.println("e is a Bird");  
    if(b instanceof Bird) System.out.println("f is a Bird");  
    }  
}