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

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

例子1

interface MyInterface {	
	void back();
}

public class MyClass implements MyInterface {

	public static void main(String[] args) {

	}
	
	//实现接口方法,此时等于被调用状态
	@Override
	public void back() {
		// TODO Auto-generated method stub
		System.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();
	}
	
	@Override
	public void back() {
		// TODO Auto-generated method stub
		System.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() {
			
			@Override
			public void back() {
				// TODO Auto-generated method stub
				System.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() {
			
			@Override
			public void back() {
				// TODO Auto-generated method stub
				System.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() {
			
			@Override
			public void front() {
				// TODO Auto-generated method stub
				System.out.println("我是MyInterface接口的方法front");
				
			}
			
			@Override
			public void back() {
				// TODO Auto-generated method stub
				System.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)的实现方式还是很相似的,笔者在这里就不做过多的分析了。如果读者认为该文章有不对或值得改进的地方,请在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值