匿名内部类
上述的匿名内部类的语法是下述形式的简化形式
注意:如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。
/**
* Created by Panda on 2018/6/8.
*/
//在匿名类中不可能有命名构造器(因为它根本没名字),但通过实例初始化,就能够达到为匿名
//内部类创建一个构造器的效果。
abstract class Base{
public Base(int i){
System.out.println("Base constructor,i="+i);
}
public abstract void f();
}
public class AnnoymousConsructor {
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();
}
/**
* Base constructor,i=47
Inside instance initializer
In anonymous f()
*/
}
//在此例中,不要求变量一定是final的。因为i被传递给匿名类的基类的构造器,并不会在匿名类内部被直接使用。
/**
* Created by Panda on 2018/6/8.
*/
public class Parcel10 {
public Destination destination(final String dest,final float price){
return new Destination() {
private int cost;
//在实例初始化操作的内部,不能作为字段初始化动作的一部分来执行(if语句)
//对于匿名类而言,实例初始化的实际效果就是构造器。
//当然收到限制:不能重载实例初始化方法,仅有一个这样的构造器
{
cost=Math.round(price);
if(cost>100) System.out.println("over budget!");
}
private String label=dest;
@Override
public String readLabel() {
return label;
}
};
}
public static void main(String[] args) {
Parcel10 parcel10 = new Parcel10();
Destination destination=parcel10.destination("milk",105.3f);
}
}
匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。