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
- java 匿名内部类和接口回调的相似之处
- java的内隐类之匿名内部类的成员匿名内部类和方法匿名内部类
- Java--类和接口--常规内部类,静态内部类,局部内部类,匿名内部类,抽象类,接口
- Java类和接口(常规内部类、静态内部类、局部内部类、匿名内部类、抽象类、接口)
- Java -- 内部类, 成员内部类,局部内部类,匿名内部类,闭包和回调, 枚举类
- 【java 之匿名内部类的总结】
- Java的内部类和匿名内部类
- Java当中的内部类和匿名内部类
- java静态内部类和匿名内部类的使用
- java中的内部类和匿名内部类的使用
- Java内部类和匿名内部类的区别
- java局部内部类和匿名内部类的比较
- Java的内部类和匿名内部类
- java中接口内的匿名内部类
- Java之局部内部类和匿名内部类的区别详解(附源码)
- java内部类之匿名内部类
- Java内部类之匿名内部类
- java的内部类和匿名类
- 蓝桥杯训练题:爆搜——海盗喝酒
- 07-Redis入门介绍学习
- 06_HttpEntity的使用
- 对于使用encodeURI编码,后台接收参数,在页面进行展示,IE浏览器只能显示部分信息,谷歌,火狐能全部显示
- Mac mysql 5.7.18 中文乱码问题
- java 匿名内部类和接口回调的相似之处
- flex布局教程
- c#Socket通信入门实例
- stringentity、urlEncodeFormEntity区别
- Activiti_API
- SAP HANA查询日期是星期几
- Coin Change
- html5第八课时,属性选择器
- HDU 2553 N皇后问题(dfs)