相信学过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)的实现方式还是很相似的,笔者在这里就不做过多的分析了。如果读者认为该文章有不对或值得改进的地方,请在评论区留言。