【求助】对于instanceof的新理解

頑笑 2009-08-21 09:57:50
加精
最近在看《SCJP指南》的时候,有一点理解不透,请大家先看如下的例子:

public class InstanceOfDemo {

public static void main(String[] args) {
System.out.println(new InstanceOfDemo() instanceof String); //compile time error
System.out.println(new InstanceOfDemo() instanceof Exception); //compile time error
System.out.println(new InstanceOfDemo() instanceof Object); //compilation and output true

System.out.println(new InstanceOfDemo() instanceof List); //compilation and output false
}
}

我原本以为前两行会打印出false,但是竟然是编译错,上网查了一下中文资料,但是得到的最好的答案是:instanceof与Class的cast()方法相同。
我觉得这样仍然解释不通,从我的测试来看,我发现Java是不是对instanceof操作符进行了某种优化,也就是说:在编译器就对java.lang包的类进行了检查。
当然这只是我的猜测,希望大家能一起证明一下,太感谢了。
...全文
6211 155 打赏 收藏 转发到动态 举报
写回复
用AI写文章
155 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdy1234567 2012-07-24
  • 打赏
  • 举报
回复
泛型信息会在运行时被擦除。使用instanceof判断泛型,只能使用这种形式:obj instanceof Type<?>
例如:
if(userList instanceof List<?>){}
leebo_gemini 2011-08-23
  • 打赏
  • 举报
回复
学习ing
HHH245252 2011-08-22
  • 打赏
  • 举报
回复
呵呵 很深入的探讨呢。 学习了。 谢谢前辈们- -。
dunjianwei 2011-08-22
  • 打赏
  • 举报
回复
还是不太懂,怎么弄啊
hjt013 2011-07-01
  • 打赏
  • 举报
回复
进来学习下
燕冠楠 2011-06-16
  • 打赏
  • 举报
回复
instanceof 的作用是 检查 是否有继承关系的类和对象 或者是不是他本身
liggway 2010-06-24
  • 打赏
  • 举报
回复
[Quote=引用 93 楼 baobao04551 的回复:]
试一下下面这段就知道了。。。

原因是出在一个类和一个接口上。如果是接口。则编译器在编译时无法确定其是否为其子类。

但是如果是类。编译器可以检查其extends关键字对此处进行编译。


Java code


interface Instance4t
{

}

class Instance5t
{

}

public class In……
[/Quote]

你可以试试Throwable啊,可见lang下面的接口和类都会去检查的
苦轮中的头陀 2010-04-02
  • 打赏
  • 举报
回复
♡ ♡
zhentengai 2010-01-21
  • 打赏
  • 举报
回复
首先 声明一点 我不是什么高手,


但是 我知道 如果要使用 某个类型 或者 对象 必须先声明或者定义!


我想知道LZ 写的 String 和 Exception 是 什么?


还有 就是 instanceof 的使用方法.
wosqqa 2009-10-03
  • 打赏
  • 举报
回复
好好学习学习
果壳 2009-09-28
  • 打赏
  • 举报
回复
顶察
bigbro001 2009-09-28
  • 打赏
  • 举报
回复
超出知识范围了。。。看不懂。。。
mynameishuchao 2009-09-28
  • 打赏
  • 举报
回复
在下认为:
只要能说通:
它是(instanceof)什么
hui94781674 2009-09-28
  • 打赏
  • 举报
回复
学习了
dong050503 2009-09-28
  • 打赏
  • 举报
回复
明知道不是还判断?
dong050503 2009-09-28
  • 打赏
  • 举报
回复
instanceof 雷同于 “+、-、*、、” 等运算符,

可以肯定的是,使用该运算符要遵循一条死规则:明知道不存在的继承关系的两变量之间不能用instanceof运算符
如:定义两个类
public class A{}
public class B{}
显然,A、B之间不存在继承关系,如果强制使用A instanceof B则不会通过编译。因为编译器知道这本来就是一个错误的比较。
但是,如果存在instanceof运算符两边的类不明显地知道他们是否有继承关系时,编译器是会通过编译的,因为它根本不知道这个运算是否是错误的,如下:
public class Test1 {
public static void main(String[] args) {
//编译时无法确定getObject()返回的引用类型的具体类型,下面两句都能通过编译
System.out.println(getObject() instanceof Object);
System.out.println(getObject() instanceof String);
}
public static Object getObject() {
Test1 test=new Test1();
return test;
}
}
由于编译器,编译的时候并不知道getObject()返回的值,所以不会判断 getObjiect() instanceof String 语句有错误,故可以通过编译。
如果:Test1 test=new Test1();
System.out.println(test instanceof String);
在这种,明显的,不用instacnceof就知道,test 不是String的子类的情况下,类是不会通过编译的。
弘石 2009-09-28
  • 打赏
  • 举报
回复
学习
yanggddhh 2009-09-27
  • 打赏
  • 举报
回复
好复杂的东西...看不懂
yangghhdd 2009-09-27
  • 打赏
  • 举报
回复
up!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
obububu 2009-09-27
  • 打赏
  • 举报
回复
mark ~~~~~~~~~~~~~~~~
加载更多回复(134)

62,617

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧