问题引出:
今天在学习关于java网络抓包源码时候碰到这么一段:
private PacketReceiver handler=new PacketReceiver(){
public void receivePacket(Packet packet) { //根据API 这是接口里面的唯一方法
// System.out.println(packet); //对packet进行处理 根据API 每抓到一个包都会调用一次该方法
frame.dealPacket(packet);
}
};
查阅Jpcap API 后得知PacketReceiver是一个接口,其方法是receivePacket(Packet p) ,如图所示:
由于之前看到过接口不能实例化,因此引发了我的不解,上网查资料,有篇帖子解除了我的疑惑,在此搬来,谢谢该博主。
问题解答:
如题所示,这里有两个问题:
1、java的接口能否实例化
2、java如何去扩展一个接口
首先解决第一个问题,回答是:java接口不能直接实例化,不过有种方式看起来很像实例化,如下面代码所示:
05 | public class TestNewInterface{ |
06 | TestNew te = new TestNew(){ |
10 | public void TestNew() { |
上面这种方式也是比较常使用的,但是要注意一点,这样使用new一个接口的时候,必须将接口的所有方法都实现,比如上面的,必须将test()和TestNew()两个方法实现。
另外注意一点,接口中是没有构造函数这种说法的,上面的例子中虽然出现了和接口名一样的方法,但是他不是构造方法,有个明显的标志是,构造函数是没有返回值的,但是上面的方法中存在了void类型的返回值,所以可以判定,TestNew()方法不是构造方法,这一点也提示我们,在以后的编程中,尤其是接口一定要注意不要使用构造方法,同时在给方法命名的时候,要注意最好不要和接口名一样,虽然java编译器不认为这是种错误,但是很容易产生混淆。
==========================华丽的分割线=========================================
关于第二个问题:java如何去扩展一个接口呢? 答案是通过继承,这一点我刚开始不是很理解,我一直以为只有类是可以集成的,但是没有想到接口也可以继承,(可能我的知识不够充实^_^),下面有个例子可以做个参考:
04 | interface Intface2 extends Intface1{ |
08 | public class TestNewInterface implements Intface2{ |
09 | public void test01(){} |
10 | public void test02(){} |
注意在这时候,如上面的例子中的Intface2接口,如果实现这个接口的话,必须同时将Intface1接口中的方法给实现了,否则编译器会报错。
自己的总结:
接口可以按照上述方法实例化,且可以作为函数的参数 ,如 jpcap中有这样两个方法:
我不知道这与接口回调有什么区别,关于接口回调我看了些资料不是很明白,希望能有人看到指点我一下。
学生党自学java,希望能得到大家指点。
注:如果有人需要jpcap相关资料的话可以留言我,我有jpcap包,API和相关论文。