如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的,如果没有,将会出现一个编译时错误消息
import com.javabase.chaptersix.Destination; public class Parcel9 { public Destination destination(final String dest){ return new Destination(){ private String label = dest; public String readLabel(){ return label; } }; } public static void main(String[] args) { Parcel9 p = new Parcel9(); Destination d = p.destination("Tasmania"); } }
通过实例初始化,能够达到为匿名内部类创建一个构造器的效果
abstract class Base{ public Base(int i){ System.out.println("Base constructor, i = " + i); } public abstract void f(); } public class AnonymousConstructor { public static Base getBase(int i){ return new Base(i){ { System.out.println("Inside instance initializer"); } @Override public void f() { System.out.println("In anonymous f()"); } }; } public static void main(String[] args){ Base base = getBase(47); base.f(); } }
在上例中,不要求变量i一定是final的。因为i被传递给匿名类的基类的构造器,它并不会在匿名类内部被直接使用。
重剑无锋,大巧不工