定义:巴拉巴拉巴拉,就不写了。
语法:
部分内容来源于:什么是匿名内部类,如何使用匿名内部类_Weihaom_的博客-程序员宅基地_匿名内部类
在开发过程中,我们经常会遇到某个类/接口中的方法在程序中只实现一次。如果用传统方式,为了使用该方法,我们需要新建一个实现类去extends/implements某个类/接口,然后实例化对象,再用对象去调用方法,很麻烦。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
传统方式:很麻烦的,尤其是当method()方法,只使用一次的时候,为了这一次使用,去创建一个实现类,写这么多,太麻烦了!
package com.hspedu.innerClass;
public class AnonymousInnerClassMG {
public static void main(String[] args) {
B b = new B();
b.method();
}
}
interface A {
public void method();
}
class B implements A{
@Override
public void method() {
System.out.println("我是方法");
}
}
匿名内部类方式:作用是简化上面的代码
package com.hspedu.innerClass;
public class AnonymousInnerClassMG {
public static void main(String[] args) {
A a = new A() {
@Override
public void method() {
System.out.println("我是method");
}
};
a.method();
}
}
interface A {
public void method();
}
另外,匿名内部类那块还可以这样写:
package com.hspedu.innerClass;
public class AnonymousInnerClassMG {
public static void main(String[] args) {
new A() {
@Override
public void method() {
System.out.println("我是method");
}
}.method();
}
}
interface A {
public void method();
}
Tips:
1、我们也用匿名内部类的方式去创建并启动线程:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是一个线程");
}
}).start();
2、安卓开发中button的监听事件,也是用了匿名内部类。
看下面代码的注释应该就明白了:
package com.hspedu.innerClass;
/*
演示匿名内部类的使用
*/
public class AnonymousInnerClass {
public static void main(String[] args) {
Outer04 outer04 = new Outer04();
outer04.method();
}
}
class Outer04{ //外部类
private int n1 = 10; //属性
public void method(){ //方法
//基于接口的匿名内部类
//1.需求:想使用IA接口,并创建对象
//2.传统方式:是写一个类,实现该接口,并创建对象
//3.现在的需求是Tiger/Dog类是只使用一次,后面再也不使用了,按照传统的写法就比较麻烦和浪费
//4.于是使用匿名内部类来简化开发
//5.tiger的编译类型?是IA
//6.tiger的运行类型?就是匿名内部类,名称就是外部类$1。即Outer04$1
/*
我们看底层:Outer04$1就是我们的匿名内部类名字,这个名字是底层分配的,其实底层是有这个implement的行为
class Outer04$1 implements IA{
@Override
public void cry() {
System.out.println("老虎叫");
}
}
*/
//7.jdk底层在创建匿名内部类Outer04$1,立即马上就创建了Outer04$1实例,
//并把地址返回给了tiger
//8.匿名内部类使用一次,就不能再使用了(不是tiger对象哦)
IA tiger = new IA() {
@Override
public void cry() {
System.out.println("老虎叫");
}
};
System.out.println("tiger的运行类型= " + tiger.getClass()); //tiger.getClass()就是获得tiger对象的运行类型
tiger.cry();
}
}
interface IA{ //接口
public void cry();
}
对接口、具体类、抽象类都可以使用匿名内部类,而且对方法的个数没有要求。
//具体类
public class Class01 {
public void show(String s){
System.out.println("啦啦啦");
}
}
//抽象类
public abstract class AbstractClass01 {
abstract void show(String s);
}
//接口
public interface Interface01 {
void show(String s);
}
public class TestInner {
public static void main(String[] args) {
//重写具体类的方法
new Class01(){
@Override
public void show(String s) {
System.out.println("我是一个" + s);
}
}.show("具体类");
//重写抽象类的抽象方法
new AbstractClass01(){
@Override
void show(String s) {
System.out.println("我是一个" + s);
}
}.show("抽象类");
//实现接口的抽象方法
new Interface01(){
@Override
public void show(String s) {
System.out.println("我是一个" + s);
}
}.show("接口");
}
}
运行结果
我是一个具体类
我是一个抽象类
我是一个接口
1、匿名内部类的语法比较奇特,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,从语法上看,既有定义类的特征,也有创建对象的特征。
左图是因为匿名内部类new A(){}也是一个对象,因此是直接调用了cry方法。
右图是因为匿名内部类也是一个类,所以用实例化的对象a去调用cry方法。
在前面的文章中讲解了卷积编码和删余,实现了1/2、2/3、3/4编码速率的输出。数据域在编码之后,下一个部分就是交织。今天对交织进行具体实现。
文章浏览阅读648次。移动硬盘在目前工作和学习中都是一个比较重要的工具。如果遇到移动硬盘无法读取的情况,应该如何解决呢?小编给大家总结了几个简单有效的操作方法,记得收藏起来哦!_新硬盘无法识别
文章浏览阅读250次。在目前的小程序版本尚不支持发红包这个功能,开发者们表面笑嘻嘻,心里妈卖批!在这里,提供一种已经实践过的解决思路。详细解析,就是下面的几个步骤1、首先是在小程序里面的领红包入口2、点击后跳转webview, 附带当前的小程序的token给webview验证,webview 的src 指向具备付款能力的服务号的一个获取openid页面,根据附加的token来判断用户是否可以领取红包,此时用户拥有两个o..._小程序 可以用微信支付 现金红包php
文章浏览阅读104次。跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例 ..._app风格案例视频
文章浏览阅读4k次,点赞4次,收藏22次。1. 下载并安装海康 web 插件https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=102. 把上一步解压的三个 js, 复制到你的项目中, 根据路径, 自己引入到 index.html 中3. 建议运行它的 demo, 大概看看代码, 了解一下它的大致结构, 它的注解很详细, 3 分钟就能看完4. 贴上我的代码(我的是每次只显示一个画面, 点击摄像头切换画面)<temp.._vue-hkvideo
文章浏览阅读5.3k次,点赞3次,收藏4次。很多时候需要用到这个css效果,实际上就用了一个li标签的热点样式,不仅是li标签,div等也可以的完整代码如下,div/css鼠标热点改变li标签背景颜色body{ background-color:#CCCC99; margin:0; padding:0; color:#fff;}ul{ margin:0; padding:50px;}li{ list-style:none; height:2..._ul li 样式 鼠标移入颜色
文章浏览阅读90次。手脚架是什么?众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了。我用得vue-cli也是其中之一,还有其他的我也说不清,我就说一下我接触比较多的这款vue-cli,但是所有手脚架的核心:都是为了能够快速搭建一个完整的项目的结构,开发者只需要在生成的项目结构的基础上进行开发即可,非常简单高效。然后..._如何上线vue-cli手脚架项目到服务器
文章浏览阅读794次,点赞19次,收藏19次。2、multiprocessing.Process类的join()方法可以阻塞主进程,当子进程没有进行完成的时候,主进程hold。2、threading.Thread类的join()方法可以阻塞主进程,当子线程没有进行完成的时候,主线程hold。3、可以通过继承multiprocessing.Process并重写run()函数的方法来实现多线程。1、线程通过multiprocessing.Process类的start()方法启动。1、线程通过threading.Thread类的start()方法启动。
要能够将 API 调用的响应本地存储到缓存中,首先,我们需要定义缓存并通知客户端。在下面的代码片段中,我们使用 okhttp 库中的 Cache 类定义了缓存。我们将此缓存的最大大小设置为 5 MB。然后,在初始化 okhttpclient 参数时使用cache()函数。.build()如果设备连接到互联网:如果最后一次 API 响应是在不到 30 分钟之前检索的,则显示缓存的响应;否则,获取新的响应并将其存储在缓存中。如果设备离线:使用最多 1 天前的 API 响应以保持应用程序功能。
而其较为出众的一点,就是较好的可拓展性,即丰富的插件应用,这些应用可以极大地提高生产效率,并优化日常使用。可以发现,其整体格局和我们常见的流程图编辑应用较为类似,其主题颜色也与我们的VS Code保持一致,在这里为了编辑方便,我们还是将编辑器主题改为浅色。当然,其功能仍存在局限,不能够完全代替我们传统的图形绘制工具,但也可以作为我们日常工作的有益补充,帮助我们完成一些特定情景下的项目。整体布局也十分明晰,与我们常用的Visio极为类似:左侧为形状选项卡,中间为画布容器,右侧为样式编辑。
之前在说了我的第一版静态资源代理,后面我又完善了一下:照着以上思路,可以在其他语言其他框架中实现,因为对框架没有依赖,都是使用的一些基本功能。
文章浏览阅读338次,点赞4次,收藏6次。架构师不是天生的,是在项目中磨练起来的,所以,我们学了技术就需要结合项目进行实战训练,那么在Android里面最常用的架构无外乎 MVC,MVP,MVVM,但是这些思想如果和模块化,层次化,组件化混和在一起,那就不是一件那么简单的事了,我们需要一个真正身经百战的架构师才能讲解透彻其中蕴含的深理。此时,RecyclerView第一个item是添加进Adapter中的最后一个,最后一个item是第一个加进Adapter的数据,RecyclerView会自动滑到末尾,另外item整体是依靠下方的。