java中两种有趣的匿名类实现
java中的匿名类除了还有两种有趣的用法
?
/** * TODO Comment of AnonymousTest * * @author aotian.zhuw */class EntryInterface { public void print() { System.out.println("hello world"); }}public class AnonymousTest { private EntryInterface a; public void setA(EntryInterface a) { this.a = a; } public void print() { a.print(); } public static void main(String[] args) { AnonymousTest test = new AnonymousTest(); test.setA(new EntryInterface() { public void print() { System.out.println("test success."); } }); test.print(); }}?
首先看上面的代码我们在setA中传入的是一个匿名类
编译之后得到三个文件EntryInterface.class?AnonymousTest.class ?AnonymousTest$1.class
反编译AnonymousTest$1.class文件,得到的结果如下
?
package cn.zw;import java.io.PrintStream;// Referenced classes of package cn.zw:// EntryInterface, AnonymousTeststatic class AnonymousTest$1 extends EntryInterface{ public void print() { System.out.println("test success."); } AnonymousTest$1() { }}??
结果我们发现,java的编译器自动创建了一个EntryInterface的子类,
名为AnonymousTest$1,且该类覆盖了父类的print()方法。
修改AnonymousTest类
?
interface EntryInterface { public void print();}public class AnonymousTest { private EntryInterface a; public void setA(EntryInterface a) { this.a = a; } public void print() { a.print(); } public static void main(String[] args) { AnonymousTest test = new AnonymousTest(); test.setA(new EntryInterface() { public void print() { System.out.println("test success."); } }); test.print(); }}??编译之后仍旧得到三个文件EntryInterface.class?AnonymousTest.class ?AnonymousTest$1.class
?反编译AnonymousTest$1.class文件,得到的结果如下
?
import java.io.PrintStream;// Referenced classes of package cn.zw:// EntryInterface, AnonymousTeststatic class AnonymousTest$1 implements EntryInterface{ public void print() { System.out.println("test success."); } AnonymousTest$1() { }}?这次我们发现编译器创建的AnonymousTest$1类实现了EntryInterface接口,很有趣。