先说结论

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

再说起因

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

  1. public class FooBeanInfo extends SimpleBeanInfo {
  2.  
  3. public PropertyDescriptor[] getPropertyDescriptors() {
  4. try {
  5. final PropertyEditor numberPE = new CustomNumberEditor(Integer.class, true);
  6. PropertyDescriptor ageDescriptor = new PropertyDescriptor("age", Foo.class) {
  7. public PropertyEditor createPropertyEditor(Object bean) {
  8. return numberPE;
  9. };
  10. };
  11. return new PropertyDescriptor[] { ageDescriptor };
  12. }
  13. catch (IntrospectionException ex) {
  14. throw new Error(ex.toString());
  15. }
  16. }
  17. }

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

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

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

二话不说,先验证一番:

先来一个类:

  1. package inherit;
  2.  
  3. /**
  4. * @author LarryZeal
  5. *
  6. */
  7. public class Editor {
  8.  
  9. public void hello() {
  10. System.out.println("hello from Editor");
  11. }
  12. }

再来个测试:

  1. package inherit;
  2.  
  3. import org.junit.Test;
  4.  
  5. /**
  6. * @author LarryZeal
  7. *
  8. */
  9. public class InheritFromEditorTest {
  10.  
  11. /**
  12. * 对接口来说是匿名实现,对类来说就是匿名子类了。
  13. */
  14. @Test
  15. public void run() {
  16. Editor editor = new Editor() {
  17. public void hello() {
  18. System.out.println("what!!!");
  19. }
  20. };
  21.  
  22. editor.hello();
  23. }
  24. }

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

再说下用途

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

补充

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

  1. @Test
  2. public void run2() {
  3. Map<String, String> map = new HashMap<String, String>() {
  4. {
  5. put("1", "1");
  6. put("2", "2");
  7. put("3", "3");
  8. put("4", "4");
  9. put("5", "5");
  10. // ...
  11. }
  12. };
  13. }

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

匿名内部类 Inner class的更多相关文章

  1. java中的匿名内部类总结

    原文地址: http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内 ...

  2. JAVA匿名内部类

    首先定义一个抽象类Computer public abstract class Computer { //抽象类是不可以常见对象的 int a=1; public abstract void onli ...

  3. Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

    ---------------------------------------------------------------------------------------------------- ...

  4. 匿名内部类与equals之学习要扎实

    匿名内部类是胡哥给我上的第一节课,他一直在不断强调着“逻辑与思维”的重要性, 遇到问题不能用“不知道和没学过”去逃避它,所有的不知道和没教过都源自于没见过,一定要学会去看源代码,不要人云亦云..... ...

  5. jdk8 Lambda表达式与匿名内部类比较

    Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...

  6. 为什么匿名内部类只能访问final变量【转】

    是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final.因为虽然匿名内部类在方法的内部,但实际编译的时候, ...

  7. java提高篇(十)-----详解匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  8. Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...

  9. java 22 - 22 多线程之 匿名内部类的方式实现多线程

    首先回顾下之前的匿名内部类: 匿名内部类的格式: new 接口或者接口名(){ 重写方法 }; 本质:是该类或者接口的子类对象 匿名内部类方式使用多线程 1.new Thread(){代码-}.sta ...

  10. 匿名内部类为什么访问外部类局部变量必须是final的?

    1.内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命, ...

随机推荐

  1. websocket 协议 使用

    1.websocket简介 websocket最主要特点是:服务器可以主动给浏览器发送消息,而不是被动接收浏览器请求. websock协议可以参考:http://www.ruanyifeng.com/ ...

  2. JSON格式校验

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  3. Java之JVM调优案例分析与实战(4) - 外部命令导致系统缓慢

    环境:这是一个来自网络的案例:一个数字校园应用系统,运行在一台4个CPU的Solaris 10操作系统上,中间件为ClassFish服务器.系统在进行大并发压力测试的时候,发现请求响应时间比较慢,通过 ...

  4. js经常使用功能代码

    js经常使用功能代码(持续更新): 1---折叠与展开 <input id="btnDisplay" type="button" class=" ...

  5. 查看 apache、nginx、php、mysql 的编译参数

    查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看m ...

  6. 利用DM工具Weka进行数据挖掘(分类)的完整过程

    利用DM工具Weka进行数据挖掘(分类)的完整过程:

  7. EMQ 学习---MQTT消息QoS

    MQTT发布消息QoS保证不是端到端的,是客户端与服务器之间的.订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS. 客户端连接: 客户端完成TCP三次握手之后,还需要发 ...

  8. ASP.NET给DataGrid,Repeater等添加全选批量删除等功能

    很多情况下,在管理或者查看列表的时候我们需要很需要“全选”这个功能,这在ASP.NET中是非常容易实现的,下面我就将演示一点小代码实现这一功能.   实现全选的还是js的一个小函数:   [code] ...

  9. 支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)

    /* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: minzhenfei@163.com */ 背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是 ...

  10. CentOS 之 Supervisor

    CentOS 之 Supervisor supervisor是一个Linux上用来管理程序后台运行的工具,支持程序的自启动,挂掉重启,日志等功能.可配置程序随系统启动,并支持挂掉重启,增强程序稳定性. ...