今天在学习抓包软件源码时碰到这么一段
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、纸上得来终觉浅,绝知此事要躬行。还是得练,而且是独立,脱离书本,脱离视频,亦步亦趋进步实在太慢!
感觉写了这么多,就一个小儿科的问题,如有错误还请指出,见笑了!