java稀奇语法-匿名内部类

匿名内部类

what

匿名内部类还是一个类,这个类一般创建一次,使用一次,没有名字,因此是匿名的。

java8中出了一个lambda表达式,好像就是为了匿名类而生,因为有的时候给一个方法传一个类,仅仅使用了这个类的方法,然后这个类的方法被调用,lambda可以帮我们轻松的解决这个问题

这是内部类的情况,大家一般也都知道,但是今天我遇到一个情况很有意思,自己可以记录一下

来一段代码

/**
 * @author richard
 * 记录下这个xiaodemo 顺便做个记录,为什么匿名内部类内部加个代码块就可以获得局部变量的访问权限了
 */
public class Demo {
    private static  String s ="" ;
    public static abstract class Parent{
        Parent(String string){
            System.out.println("开心"+string);
        }
    }

    public static void main(String[] args) {
        new Parent("开心"){
            //外置代码块
            //s.toString();
            {
                s.toString();
            }
        };
    }
}

why

出现的问题就是为什么匿名内部类中有一个{{}}的双重括号,他们有什么用,先来个总结,首先new Parent(){} 这个匿名类最外层括号,也就是我们匿名内部类中的代码块,可以在这里面写方法,但是最里层的{}大家应该知道是什么了吧,就是我们的构造代码块,那么构造代码块能做什么

构造代码块可以帮助我么在构造匿名类的时候当做构造代码块使用,可以在构造代码块中进行一些操作,来辅助内部类的构造

那么构造代码块,和代码块中就涉及到了域关系,作用域不同了

其实上面的面方法就类似于这个类

    //s.toString() 和下面是等价的哈哈
    public static class child extends Parent{
        //这个位置就是外层代码块
        child(String string) {
            //这里面就是内层代码块
            super(string);
            s.toString();
        }
    }

是不是感觉很神奇,其实感觉也没啥意思,哈哈,但是当时看了就感觉很神奇

也就是说我们在外置代码块那个位置写执行语句必然会报错了,因为他不在方法里面。

how

匿名类的常用地方在哪里
这里偷个懒,举几个例子吧
最近看到的JMockit

        new Expectations(){{
            try {
                departmentService.hasStudent(finalS);
                result = Boolean.FALSE;
            } catch (DepartmentServiceException e) {
                e.printStackTrace();
            }
        }};

当然jdk中比较常用的Comparator,例如给线程池传入Runnable等等

posted @ 2017-12-22 20:03  白白胖胖的空格  阅读(301)  评论(0编辑  收藏  举报