java 匿名内部类和接口回调的相似之处

来源:互联网 发布:yum安装nginx 编辑:程序博客网 时间:2024/06/09 17:39

相信学过java的读者对java的类和接口很熟悉吧。下面我们浅谈下匿名类和接口的"合作"。

例子1

interface MyInterface {void back();}public class MyClass implements MyInterface {public static void main(String[] args) {}
//实现接口方法,此时等于被调用状态@Overridepublic void back() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法");}}

例子1中有一个MyClass类和一个MyInterface接口,并且MyClass实现了MyInterface,同时也实现了back()方法,但是被调用,所以是毫无意义的。


例子2:

interface MyInterface {void back();}public class MyClass implements MyInterface {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.back();}@Overridepublic void back() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法");}}

Consele输出:我是MyInterface接口的方法

此时back方法被调用了,我们才来用一种相对例子2较高级的方法看能不能实现back方法的调用


例子3

interface MyInterface {void back();}public class MyClass {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.show(new MyInterface() {@Overridepublic void back() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法");}});}public void show(MyInterface myInterface){System.out.println("我是MyClass类的方法");}}

Consele输出:我是MyClass类的方法

例子3我们为MyClass类(并不实现MyInterface接口)添加了一个show()方法,并给该方法添加了MyInterface接口类型的参数(可以理解为MyInterface的对象)。此时我们通过调用show()方法,其中参数我们是通过 new关键字来构造的,理所当然的是你new 我这个接口的对象,你就实现我这个接口的方法吧(很霸道),就好比一个类实现了接口,就要实现该类的所有方法。请注意了,读者说的只是实现方法,并没有说到调用方法。所以在例子3中,show()方法被调用,back() 方法是不被调用的。那么读者的疑问来了,既然不能被调用,是这样写是不是显得有点鸡肋了?不急,我们接着往下看


例子4

interface MyInterface {void back();}public class MyClass {public static void main(String[] args) {MyClass myClass = new MyClass();MyInterface myInterface = new MyInterface() {@Overridepublic void back() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法");}};myInterface.back();myClass.show(myInterface);}public void show(MyInterface myInterface){System.out.println("我是MyClass类的方法");}}

虽然上述代码实现了back()函数的调用,但是相对比上述的例子没什么优点,反而更显得鸡肋了。没办法,在这个例子中,笔者知识为了说明例子3和本例子的不同。例子3产生接口对象的代码有点类似与匿名类的实现。就是说我把new 了一个对象,但是对象的地址我们有在用一个变量存储独享的地址,就好比你知道有一个大宝藏,但是不知道宝藏的具体地点,很不是感觉大宝藏的存在就没啥意义了,好气。


例子5

//这个接口其实可以放在另一个java文件里interface MyInterface {void back();void front();}//这个类其实可以放在另一个java文件里class MyClass_2{public static void myClass_2Show(MyInterface myInterface){if(myInterface != null){myInterface.back();myInterface.front();}}}public class MyClass {public static void main(String[] args) {MyClass myClass = new MyClass();myClass.show();}public void show(){MyClass_2.myClass_2Show(new MyInterface() {@Overridepublic void front() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法front");}@Overridepublic void back() {// TODO Auto-generated method stubSystem.out.println("我是MyInterface接口的方法front");}});}}

这回主角登场了,读者仔细看上段代码就会发现,在MyClass这个类的方法show()里面调用了MyClass_2的myClass_2Show(MyInterface myInterface)方法。而在myClass_2Show(MyInterface myInterface)方法里,我可以随意调用MyInterface接口的方法,也就是说,在我这么方法里面,我不管你接口方法的实现逻辑,我只管调用你,接口的实现逻辑在MyClass的show()方法里面,这样就实现了方法调用和实现的简单分离,这种方式被人们称为接口回调。这种机制在网络通信和Android处理事件方面广泛应用。

接下来我们在来说下匿名内部类吧,直接上代码

public class MyClass {public static void main(String[] args) {(new MyClass_2(){void setNum(int n){num = n ;System.out.println("num="+num);}}).setNum(10);}static class MyClass_2{int num ;}}

如果读者仔细阅读这段代码的话,就是发现匿名内部类的实现方式(标红部分)和接口(例子3)的实现方式还是很相似的,笔者在这里就不做过多的分析了。如果读者认为该文章有不对或值得改进的地方,请在评论区留言。

0 0
原创粉丝点击