是不是有同学跟我一样学了知识,不使用,一段时间就忘了? 今天说说java的匿名内部类这个东西,今天就因为这个东西被程序媛欺负了,我心里难受啊。
匿名内部类的官方说法特别不容易理解,是从"有没有名字"给它命名,而不是功能命名,导致很多人学了都不知道怎么用,考试厉害实操菜,今天就说说匿名内部类的经典实操案例。废话到此结束!
一、简单案例(错误案例)首先,先看一个简单的使用案例,假设:程序媛有一个写好的类叫做HerClass
//程序媛的类
public class HerClass {public void onChange(String content){//顺序: 3
}
}
我的类要去实例化她的类,并且调用她的方法
//我的类
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
public void onChange(String content) {//顺序:2
super.onChange(content);
}
};
//顺序:1
herClass.onChange("传输的数据");
}
}
代码跑起来的顺序如代码中的注释,顺序1-2-3。 很多网上的写法都是这么干的,确实没啥毛病,但是这么写有什么意义呢? 不具备实际使用意义,不会有这种需求。
二、匿名内部类的正确使用方法(正解案例)我以安卓中的Handle为例子,学习Android的同学一定知道Android切到UI线程的Handle.
public class Demo {public static void main(String args[]) {//顺序:1(子线程)
Message message=new Message();
message.what=999;
handler.sendMessage(message);
}
android.os.Handler handler=new Handler(Looper.getMainLooper()){@Override
public void handleMessage(@NonNull Message msg) {//顺序:2(主线程)
int data=msg.what;//得到数据999
super.handleMessage(msg);
}
};
}
main方法中通过handler.sendMessage()把消息发送到Handler类中,Handler类进行一系列的处理(也就是转到UI线程),之后调用handleMessage()方法,此时调到的方法就是我们匿名内部类里面的方法,而且是转了线程的。
三、回到我和程序媛的故事看了Android的Handle案例,我们把之前的错误案例改一版,改成有意义的案例。
假如:我让程序媛帮我算一算这个星期我花了多少钱,她可能要算五分钟,或者十分钟,这个过程不需要我等待,算好后她主动告诉我。
//我的类
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
public void onChange(String content) {Log.d("fxHou","顺序:3 我得到他计算的结果");
//顺序:3
super.onChange(content);
}
};
Log.d("fxHou","顺序:1 我告诉程序媛,帮我算一算");
//顺序:1 我告诉程序媛,帮我算一算
herClass.option("我这个星期的花钱记录");
}
}
她的类//程序媛的类
public class HerClass {public void onChange(String content){Log.d("fxHou","顺序:4 她自己存档一份");
//顺序:4
}
public void option(Object data){Log.d("fxHou","顺序:2 程序媛开始帮我计算");
//顺序:2
// TODO: 2023/1/11 程序媛开始帮我计算,计算可以使五分钟,十分钟,或者更久。
//计算好之后把结果通知回去
onChange("计算结果");
}
}
数据打印结果
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 顺序:1 我告诉程序媛,帮我算一算
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 顺序:2 程序媛开始帮我计算
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 顺序:3 我得到他计算的结果
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 顺序:4 她自己存档一份
梳理一下这份代码,发现,它形成了一种观察者模式,好好整理完全可以封装出一套观察者工具(后期出)。
四、拓展(用匿名内部类观察底层API数据)有时候我们需要拿底层API某个方法里面的数据,发现API没有提供获取的方法,而且我们只有只读权限,这时候匿名内部类就能派上用场,只要这个方法是public void就行。
//假设:这是某个我们只有只读权限的API
public class someoneApi {public void onChange(String canInfo){//假设:这里有一大堆逻辑,但是没有提供方法让我们获取canInfo
}
}
观察数据的类
public class MyClass {public static void main(String args[]) {someoneApi herClass=new someoneApi(){@Override
public void onChange(String canInfo) {//轻松得到canInfo
super.onChange(canInfo);
}
};
}
}
同理,这种办法也可以用在两个开发人员之间的代码通信,有时候我们想要获取祖传代码的参数数据,但是又不想动祖传代码,一样可以这么做。
完。。。。。。。蛋
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧