Code our life 日日行,不怕千万里;时时学,不怕千万卷

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内部类中讲到匿名类时,通过匿名类巧妙地实现了工厂方法。