E这种写发在编译的时候就会报错,instanceof的使用是为了在做类型转换的时候
不至于发生runtime error,在编译的时候就已经做了检查。

解决方案 »

  1.   

    Ticker extends Component  C 对
    Ticker 是 Ticker          A 对
    我觉得  BD 用法不对
    E  肯定不对  Ticker 与 String 没关系
      

  2.   

    To: csdn_wangkp():我知道E在编译的时候出错,我只想知道instanceof第二个操作数有没有什么限制。
      

  3.   

    To:hexiaofeng(java爱好者):先谢谢斑竹。如果说没关系就肯定不对那么,我试了这样一种情况:java.sql.Connection conn = null;
            System.out.println(conn instanceof Component);
    这两句编译就没错。如何解释?
      

  4.   

    System.out.println(conn instanceof Component);
    输出 false  ???????
      

  5.   

    To:hexiaofeng(java爱好者):是的,null instanceof XXX永远都是false,不会抛异常。
    conn和Component应该算没什么关系了吧。
      

  6.   

    一个初学者的见解不知是否正确:是不是因为String是final类的原因,它不可能有子类的。
      

  7.   

    To:jcq(疯子弟):还是要谢谢你的提醒。你的水平已经不像一个初学者了。
    这个我也试过,instanceof的第二个参数也可以是final class。如:
        String s = new String("a");
        System.out.println(s instanceof String);
      

  8.   

    to binghuodao(冰火岛)a instanceof b,有限制,a一定要是b或b的子类。
    Component不是String类的子类,所以报错,我说过
    instanceof的使用是为了在做类型转换的时候
    不至于发生runtime error而采取的一种防范措施
      

  9.   

    但是String类也有实例,也应该可以用instanceof啊
      

  10.   

    To:csdn_wangkp():谢谢,不过请看我的第四条发言,Connection也不是Component的子类呀,如何解释a一定要是b或b的子类呢。
      

  11.   

    To:cherami(cherami):同意,所以说instancdof的第二个参数不一定不能是final class呀。
      

  12.   

    To:cherami(cherami):同意,编译时是有预先的类型匹配检查。我只是想知道instanceof的第二个参数的写法有没有什么限制。
      

  13.   

    大概,instanceof也分编译期检查和运行期检查两部分。
    编译期,检查两个操作数的引用类型。
    而运行期,才作真正的比较。
    如果改成这样,就可以编译通过,并输出false了。
    import java.awt.*; class Ticker extends Component { public static void main (String [] args) { Ticker t = new Ticker(); 
    Object t2=t;
    boolean test = (t2 instanceof String); 
    System.out.println(test);} } 
      

  14.   

    To:jsyx():同意,但是编译器是如何检查两个操作数的引用类型的呢?什么样的关系才能编译通过呢?
      

  15.   

    jsyx说的
    Object t2=t;
    boolean test = (t2 instanceof String); binghuodao说的
    java.sql.Connection conn = null;
    System.out.println(conn instanceof Component);这两个例子是一样的,Connection的父类也是object,所以编译时当然能通过了,毕竟Object是
    所有类的父类么,因此我认为intenceof 后面的参数没有任何限制!并且intenceof的两边绝对不能是毫不相关的两个类,否则便已就会出错
      

  16.   

    我个人认为instanceof的使用是java为了在做类型转换的时候
    不至于发生runtime error而采取的一种防范措施 ,如果你用另外的写法
    可能编译器,解释器也能通过,但是去了它的本来意义,价值不是太大了。
      

  17.   

    To:csdn_wangkp():同意你的说法。那么又谁知道编译器又是怎么判断什么样的写法不报编译错,什么样的写法报呢?
      

  18.   

    To:dennis_woo(小飞):如果我写的时候肯定不会写两个无关的类。但是这个尺度怎么把握?什么算“绝对毫不相关”和“绝对相关”呢?
      

  19.   

    instanceof的使用规则,其实与cast是一样的。明白这点,就不会出错了
      

  20.   

    To:jsyx():这我到没想过,考虑一下。
      

  21.   

    看来jsyx说的没什么问题了,非常感谢!!!本贴结束,分数分配如下:
    jsyx:完全解释清楚,加100分。再次感谢!
    csdn_wangkp()、hexiaofeng(java爱好者)、jcq(疯子弟)、cherami(cherami)、
    dennis_woo(小飞):每位帮忙的朋友加50分。
    谢谢大家。