版权声明:本文为CSDN博主 无、涯 原创文章,可以转载但请注明出处。联系方式:[email protected] 博客地址 https://blog.csdn.net/a704397849 https://blog.csdn.net/a704397849/article/details/89556450
instanceof 用来判断指定 对象(实际引用的对象实例) 是否是 指定类或者指定类的子类 的实例
用法
boolean result = object instanceof class
- object:必选项。任意 对象 表达式。
- class:必选项。任意 对象类。
如果object 是 null,则返回 false
如果object实际引用的对象实例 是 class 的实例对象 或者 class 的子类实例对象,则返回true,否则返回false
注意: 我已经多次强调了 实际引用的对象实例 ,初学者大多没有注意这.
public class Test {
static class A{ }
static class B extends A{ }
public static void main(String[] args) {
A a = new A();
B b = new B();
System.out.println( "a instanceof A 的结果:" + ( a instanceof A ) );
System.out.println( "b instanceof A 的结果:" + ( b instanceof A ) );
System.out.println();
System.out.println( "a instanceof B 的结果:" + ( a instanceof B ) );
System.out.println( "b instanceof B 的结果:" + ( b instanceof B ) );
System.out.println();
/*
注意:
下面用Object类对象引用某个类实例 是实际应用中非常常见的
object instanceof class ,如果object 实际引用的对象实例 是 class 的实例对象
或者 class 的子类实例对象,则返回true
注意 “实际引用的对象实例” 这个词强调的'实际引用'.
*/
Object o = new A();
System.out.println( "o instanceof A 的结果:" + ( o instanceof A ) );
System.out.println( "o instanceof B 的结果:" + ( o instanceof B ) );
System.out.println();
o = new B();
System.out.println( "o instanceof A 的结果:" + ( o instanceof A ) );
System.out.println( "o instanceof B 的结果:" + ( o instanceof B ) );
System.out.println();
}
}
结果如下:
a instanceof A 的结果:true
b instanceof A 的结果:true
a instanceof B 的结果:false
b instanceof B 的结果:true
o instanceof A 的结果:true
o instanceof B 的结果:false
o instanceof A 的结果:true
o instanceof B 的结果:true
网上大多数关于instanceof 的文章举的例子都是类似上面的,然而实际项目中就仅仅这样判断一下真假,然后呢?
实际项目中很多时候 会用instanceof 判断一个对象是不是某个类或者其子类的实例 , 如果是就将这个对象强制转换为这个类的类型。如下:
if( o instanceof A ){
//o instanceof A 是真,表示o实际引用的对象类是A或A的子类,反过来A一定是o实际引用的对象类或父类
//熟悉java基础语法都知道,子类对象可以强制转换成父类对象,所以可以进行下面强制转换.
A a = A.class.cast(o);
//...
}
下面就举个我所用项目中实际用到instanceof 的例子
/**
* 收到消息
*/
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
try {
Object object = e.getMessage();
if (object == null){
return;
}
if (!(object instanceof Collection)){
return;
}
Collection<Object> c = Collection.class.cast(object);
for (Object o : c) {
if (org.jboss.netty.handler.timeout.IdleState.READER_IDLE.equals(o)) {
ChannelBuffer buffer = new DynamicChannelBuffer(ByteOrder.BIG_ENDIAN, 8);
buffer.writeByte(0);
Channels.write(ctx, e.getFuture(), buffer);
} else if (o instanceof Result1) {
Result1 result1 = Result1.class.cast(o);
//... 处理收到 result1 信息
//...
}else if (o instanceof Result2) {
Result2 result2 = Result2.class.cast(o);
//... 处理收到 result2 信息
//...
}
}
//...
} catch (Throwable t) {
if (channel.isConnected()) {
channel.close();
}
}
}
最后
网上关于instanceof 的文章很多,我还是觉得我很有必要写这篇文章,因为我看了那些文章总感觉少了点什么,要么只有定义,要么只有测试代码,有些需要注意的地方也没有指出。当然我写的也可能会有我刚说的这些问题,如果哪里不对,哪里漏了什么,还请告知,我会及时更正补充。