如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是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被传递给匿名类的基类的构造器,它并不会在匿名类内部被直接使用。

 

posted on 2017-01-26 11:53  文森博客  阅读(162)  评论(0编辑  收藏  举报