先说结论

匿名内部类分两种,一种是接口的匿名实现,一种是类的匿名子类!后者往往用于修改特定方法。

再说起因

本来以为匿名内部类很简单,就是接口的匿名实现,直到我发现了下面这段代码:

 public class FooBeanInfo extends SimpleBeanInfo {

     public PropertyDescriptor[] getPropertyDescriptors() {
try {
final PropertyEditor numberPE = new CustomNumberEditor(Integer.class, true);
PropertyDescriptor ageDescriptor = new PropertyDescriptor("age", Foo.class) {
public PropertyEditor createPropertyEditor(Object bean) {
return numberPE;
};
};
return new PropertyDescriptor[] { ageDescriptor };
}
catch (IntrospectionException ex) {
throw new Error(ex.toString());
}
}
}

注意第6行到第10行之间的代码。

开始以为PropertyDescriptor是一个接口,结果不是,这就是一个正常的类。懵比。。WTF!!!

好在几分钟内就转过来了,这个似乎可能好像也是内部类吧?

二话不说,先验证一番:

先来一个类:

 package inherit;

 /**
* @author LarryZeal
*
*/
public class Editor { public void hello() {
System.out.println("hello from Editor");
}
}

再来个测试:

 package inherit;

 import org.junit.Test;

 /**
* @author LarryZeal
*
*/
public class InheritFromEditorTest { /**
* 对接口来说是匿名实现,对类来说就是匿名子类了。
*/
@Test
public void run() {
Editor editor = new Editor() {
public void hello() {
System.out.println("what!!!");
}
}; editor.hello();
}
}

运行,结果输出"what!!!",验证通过,果然如此。

再说下用途

匿名子类往往用于重写特定的方法。

补充

根据某群内 随意丶nice 童鞋的提示,还有更进一步的用法:

 @Test
public void run2() {
Map<String, String> map = new HashMap<String, String>() {
{
put("1", "1");
put("2", "2");
put("3", "3");
put("4", "4");
put("5", "5");
// ...
}
};
}

利用匿名子类的构造代码块执行某些特定操作,还不需要使用对象的引用!省时省力哦!

最新文章

  1. Webstorm 2016.3激活码
  2. JS 4 新特性:混合属性(mixins)之二
  3. OFFSET约束(OFFSET IN 和OFFSET OUT)
  4. 基于bshare分享平台,在一个页面上实现多个不同内容的web分享
  5. HDU 3353
  6. C# 支持多种语言
  7. 嵌入式 hi3518平台检测网线是否插上
  8. 【技术贴】webservice 调用 Transport error : 401 Error:Una
  9. PHP文件的上传下载
  10. Java并发编程--线程封闭(Ad-hoc封闭 栈封闭 ThreadLocal)
  11. rsync+inotify脚本
  12. 走进javascript——数组的那些事
  13. bzoj 4918: 回文数对
  14. #YCB#待做题目与填坑资料
  15. 数据挖掘_requests模块的get方法
  16. C# 字符串 输出格式 指定间隔 通用性很强
  17. 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏
  18. .NetCore下使用Prometheus实现系统监控和警报 (四)客户端代码处理
  19. 【Ubuntu】使用记录
  20. pre 标签的使用

热门文章

  1. 微信小程序 - 为何setData到页面上有的加分号
  2. linux系统中的DNS服务器介绍
  3. DBA 需要知道N种对数据库性能的监控SQL语句
  4. HBase in Action前三章笔记
  5. Java 同步器
  6. HBase权威指南 高清中文版 PDF(来自linuxidc)
  7. 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)
  8. 【Unity】开发WebGL内存概念具体解释和遇到的问题
  9. Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型
  10. appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行iphone app