匿名内部类 Inner class

先说结论

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

再说起因

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

 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 }
View Code

注意第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 }

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

 

posted on 2016-10-11 16:31  LarryZeal  阅读(361)  评论(0编辑  收藏  举报

导航