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接口,很有趣。