instanceof详细介绍和使用,实际项目中的使用案例

版权声明:本文为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 的文章很多,我还是觉得我很有必要写这篇文章,因为我看了那些文章总感觉少了点什么,要么只有定义,要么只有测试代码,有些需要注意的地方也没有指出。当然我写的也可能会有我刚说的这些问题,如果哪里不对,哪里漏了什么,还请告知,我会及时更正补充。

猜你喜欢

转载自blog.csdn.net/a704397849/article/details/89556450