instanceof的理解

           今天在学习抓包软件源码时碰到这么一段 

                 if (p instanceof IPPacket) { //测试 左边的对象是否是右边类的实例 

			if (((IPPacket) p).version == 4) {  //得到IPPacket包版本 分别改变相应数据 
				this.ipv4PacketNum++;
			}

			if (((IPPacket) p).version == 6) {
				this.ipv6PacketNum++;
			}

			switch (((IPPacket) p).protocol) {
			case IPPacket.IPPROTO_ICMP:
				this.icmpPacketNum++;
				break;

			case IPPacket.IPPROTO_TCP:
				this.tcpPacketNum++;
				break;
			case IPPacket.IPPROTO_UDP:
				this.udpPacketNum++;
				break; 

			}
		} else if (p instanceof ARPPacket) {
			this.arpPacketNum++;
		}
 然后分别是对ARPPacket , TCPPacket, UDPPacket和ICMPPacket进行处理的代码,

                        if(p instanceof ARPPacket){
				arpNum++;  //非原作者代码,处理过程被我简化了
			}
		
			if(p instanceof ICMPPacket){
				icmpNum++;
			} 
				
			if (p instanceof TCPPacket) {
			         tcpNum++;
			} 
			
			if (p instanceof UDPPacket) {
				udpNum++;
			}

当查阅了JPCAP 的API及相关资料后,得出Packet类组织结构图:

  
           于是就产生了一个疑问,既然TCP,UDP,ICMP是IPPacket的子类(查了资料证明IP包包括TCP和UDP),且经自己测试证明抓取的都是TCPPacket,UDPPacket和ICMPPacket对象,那么为什么在 p instanceof IPPacket这里也能通过,而且得到的IPPacket的数量=tcpNum+udpNum+icmpNum??
总而言之, 为什么  子类对象 instanceof 父类 会返回true呢?在经过一番努力以后 我看到这么一段:
举个例子:
String s = "I AM an Object!";
boolean isobject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instanceof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isobject的值为true。
这是百度百科对instanceof的解释,给了我启发,String类是Object的一个子类,于是我再次自己写了一段测试代码:
首先定义一个dog类 
package netcap.model;

public class dog
{
 public String name;
 public String sex;
 public dog(String name,String sex)
 {
	this.name=name;
	this.sex=sex;	 
 }
}
再定义一个goldenHair(金毛...无视我的Chinglish)

package netcap.model;
public class goldenHair extends dog
{
	public String color;
	public goldenHair(String name,String sex,String color)  //构造函数 
	{
		super(name,sex);
		this.color=color;
	}		
	public static void main(String[] args)
	{
		goldenHair kaka=new goldenHair("kaka","boy","golden");
		if(kaka instanceof goldenHair)
		{
			System.out.println("是金毛的实例");
		}
		if(kaka instanceof dog)
		{
			System.out.println("也是狗的实例");
		}		
	}
}
运行结果:
是金毛的实例
      也是狗的实例
证明了我的猜测,加深了我的理解。
总结几点:
1、基础很重要,非常非常重要,自己写个测试小代码都不能信手拈来,欠练啊!
2、遇到问题积极动脑筋思考,对加深记忆理解有至关重要的作用,其实我已经编辑好问题准备发帖了,想了想还是删除了,赞自己一个!
3、纸上得来终觉浅,绝知此事要躬行。还是得练,而且是独立,脱离书本,脱离视频,亦步亦趋进步实在太慢!
感觉写了这么多,就一个小儿科的问题,如有错误还请指出,见笑了!







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值