内部类(四) 匿名内部类

xiaoxiao2021-02-28  45

匿名内部类

上述的匿名内部类的语法是下述形式的简化形式

注意:如果定义一个匿名内部类,并且希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是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); } }

匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。

转载请注明原文地址: https://www.6miu.com/read-2613519.html

最新回复(0)