java中两种有趣的匿名种实现
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, AnonymousTest static 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, AnonymousTest static class AnonymousTest$1 implements EntryInterface { public void print() { System.out.println("test success."); } AnonymousTest$1() { } }
这次我们发现编译器创建的AnonymousTest$1类实现了EntryInterface接口,很有趣。