16七/100
java中的匿名类学习笔记
定义匿名类
在声明某个类的成员属性时,可以将匿名类的实例赋值给改成员变量,也可以在某个方法中,将匿名类实例作为方法返回值
case1: 赋值给类中成员变量
class Outer { public B bb = new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) }
case2:方法中返回匿名类的实例
class Outer { public B getAnoy(){ return new B() { // B是匿名类的父类或者是一个接口 private int a = 1; private int b = 2; public function func(){ // do sth. } }; // 此处的分号一定要记得,因为这里是一条语句(表达式) } }
向匿名函数父类的构造函数传递参数
//很简单,只要在声明匿名函数的时候传递 new B(1){ //声明匿名函数 }
方法中的匿名函数使用方法的参数
当方法的参数为final时,匿名函数才能使用该参数变量
class Outer { public B getAnony(final String param) { return new B() { private String paramHolder = param; // param必须为final } } }
匿名函数的构造函数
因为是匿名函数,那么就不可能有命名的构造函数,但是可以通过Instance initialization(实例初始化)来实现类似构造函数的效果
class Outer { public B getAnony() { return new B() { { System.out.println("初始化对象时调用") } //这样就可以实现构造函数的效果了 private int a = 1; } } }
匿名类与正常的类继承的不同
尽管匿名类可以实现某个接口,也可以扩展(extends)某个类,但是不能同时实现一个接口并扩展某个类。鱼与熊掌不能兼得。
Thinking In Java内部类中讲到匿名类时,通过匿名类巧妙地实现了工厂方法。