定义

匿名内部类又叫匿名类,它有点像局部类(Local Class)或者内部类(Inner Class),只是匿名内部类没有名字,我们可以同时声明并实例化一个匿名内部类。

一个匿名内部类仅适用在想使用一个局部类并且只会使用这个局部类一次的场景。

匿名内部类是没有需要明确声明的构造函数的,但是会有一个隐藏的自动声明的构造函数。

创建匿名内部类有两种办法:

  1. 通过继承一个类(具体或者抽象都可以)去创建出匿名内部类
  2. 通过实现一个接口创建出匿名内部类

咱们看看下面的例子:

// 接口:程序员
interface Programmer {void develop();
}public class TestAnonymousClass {public static Programmer programmer = new Programmer() {@Overridepublic void develop() {System.out.println("我是在类中实现了接口的匿名内部类");}};public static void main(String[] args) {Programmer anotherProgrammer = new Programmer() {@Overridepublic void develop() {System.out.println("我是在方法中实现了接口的匿名内部类");}};TestAnonymousClass.programmer.develop();anotherProgrammer.develop();}
}

从上面的例子可以看出,匿名类既可以在类中也可以在方法中被创建。

之前我们也提及匿名类既可以继承一个具体类或者抽象类,也可以实现一个接口。所以在上面的代码里,我创建了一个叫做 Programmer 的接口,并在 TestAnonymousClass 这个类中和 main() 方法中分别实现了接口。

Programmer除了接口以外既可以是一个抽象类也可以是一个具体类。

抽象类,像下面的代码一样:

public abstract class Programmer {public abstract void develop();
}

具体类代码如下:

public class Programmer {public void develop() {System.out.println("我是一个具体类");}
}

OK,继续深入,那么如果 Programmer 这个类没有无参构造函数怎么办?我们可以在匿名类中访问类变量吗?我们如果继承一个类,需要在匿名类中实现所有方法吗?

public class Programmer {protected int age;public Programmer(int age) {this.age = age;}public void showAge() {System.out.println("年龄:" + age);}public void develop() {System.out.println("开发中……除了异性,他人勿扰");}public static void main(String[] args) {Programmer programmer = new Programmer(38) {@Overridepublic void showAge() {System.out.println("在匿名类中的showAge方法:" + age);}};programmer.showAge();}
}
  1. 构造匿名类时,我们可以使用任何构造函数。上面的代码可以看到我们使用了带参数的构造函数。
  2. 匿名类可以继承具体类或者抽象类,也能实现接口。所以访问修饰符规则同普通类是一样的。子类可以访问父类中的 protected 限制的属性,但是无法访问 private 限制的属性。
  3. 如果匿名类继承了具体类,比如上面代码中的 Programmer 类,那么就不必重写所有方法。但是如果匿名类继承了一个抽象类或者实现了一个接口,那么这个匿名类就必须实现所有没有实现的抽象方法。
  4. 在一个匿名内部类中你不能使用静态初始化,也没办法添加静态变量。
  5. 匿名内部类中可以有被 final 修饰的静态常量。

匿名类的典型使用场景:

  1. 临时使用:我们有时候需要添加一些类的临时实现去修复一些问题或者添加一些功能。为了避免在项目里添加java文件,尤其是仅使用一次这个类的时候,我们就会使用匿名类。
  2. UI Event Listeners:在java的图形界面编程中,匿名类最常使用的场景就是去创建一个事件监听器。比如:
button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {}
});

上面的代码中,我们通过匿名类实现了 setOnClickListener 接口,当用户点击按钮的时候,就会触发我们实现的 onClick 方法。

匿名类的定义,使用场景和使用方式相关推荐

  1. 内部类(static内部类)的定义与使用、与子类、接口有关匿名类的定义与使用

    内部类的定义: 在一个类中定义另一个类,这样的类称为内部类,而包含内部类的类称为外嵌类,所以内部类也是外嵌类的一种成员: 内部类要点: 1.外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用 ...

  2. Python的类中定义函数的三种方式及其利用

    类中方法/函数: 普通方法 直接定义(含self) 类方法 @classmethod 静态方法 @staticmethod 类中变量: 静态变量 普通变量 定义在构造函数中(__init__) 看代码 ...

  3. Python自定义类中定义属性的两种方式

    封面图片:<Python程序设计开发宝典>,ISBN:9787302472100,董付国,清华大学出版社 图书详情:https://item.jd.com/12143483.html 京东 ...

  4. php怎么实现匿名评论,PHP-匿名对象与匿名类的实现过程-0905

    * 匿名类: * 1. php 7.0+ 才支持 * 2. 类似于匿名函数,就是没有名称的类 * 3. 匿名类适合于一次性的创建与引用 * 4. 匿名类总是与: new 配套使用 类的三种访问方式 实 ...

  5. Java 匿名类(匿名内部类)

    Java 匿名类(匿名内部类) 学习的参考博文:无恨之都 1. 初识 匿名类 标准说法: 内部类包括:成员类.局部类.匿名类(匿名内部类). 匿名类概念: 匿名类可以使你的代码更加简洁 (JDK8之后 ...

  6. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  7. C#基础12:嵌套类、匿名类与密封类

    PS:注释和讲解全在代码中 1. 嵌套类.匿名类与密封类 using System; using System.Collections.Generic; using System.Linq; usin ...

  8. java 匿名类_浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  9. java 匿名类调用方法_Java匿名内部类使用与示例

    首先说为什么有匿名类(产生的使命) 两个原因 1.简化代码编写 某种情况下,类只需要扩展一个方法,没必要为了一个方法单独去写一个子类,然后然后调用子类,此时需要匿名类 2.在不同的包内的类内调用类的p ...

最新文章

  1. HTML中单选框的设置,和提交按钮之间的组合
  2. Java核心技术卷1——笔记(1)
  3. python之父去面试-面试题_个人文章 - SegmentFault 思否
  4. CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!—-揭秘令牌桶
  5. javascript 中的call和apply
  6. Python基础概念_2_基础概念
  7. 怎么改vue项目的标题_如何动态修改Vue项目中的页面title
  8. STM32F4_USART配置及细节描述
  9. python多线程_python多线程:控制线程数量
  10. mybatis学习与踩坑记录
  11. Ubuntu部署Java项目
  12. asp.net验证空间详说
  13. [转] 在ASP.NET MVC3中使用EFCodeFirst 1.0
  14. booth算法原理的简单化理解
  15. web高拍仪图片上传
  16. 20172302 《Java软件结构与数据结构》第五周学习总结
  17. 2021年最新最全APP各大安卓市场应用首发规则
  18. 怎么把ogg音频格式转换为mp3
  19. [推荐收藏]MAC地址完美攻略(教你如何防止IP被盗用及绑定IP)
  20. ThreadX学习(2)——线程

热门文章

  1. 解决Input输入中文重复出现拼音
  2. asp.net core 自带cookie验证authorize
  3. sql server agent会自动关闭_你微信如果绑定了银行卡,这个设置必须关闭,不然每月会自动扣钱...
  4. CPU核心数与线程数详解
  5. Vertx入门学习(含代码)
  6. RocketMQ源码(4)—Broker启动加载消息文件以及恢复数据源码【一万字】
  7. 语音控制TonyPi
  8. 谷粒商城 - 架构图
  9. 中秋月饼还没有恰到,先用css画一个月亮赏赏眼
  10. python中object的用法_【Python】【基础知识】【内置函数】【object的使用方法】