java稀奇语法-匿名内部类

Posted 白白胖胖的空格

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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等等



以上是关于java稀奇语法-匿名内部类的主要内容,如果未能解决你的问题,请参考以下文章

Java基础学习笔记十 Java基础语法之finalstatic匿名对象内部类

JAVA-匿名内部类

Java学习笔记3.8.4 内部类 - 匿名内部类

Think in java读书笔记之:java匿名内部类的继承和覆盖

JAVA——进阶语法——使用lambda表达式(λ)进行函数式编程,对匿名内部内代码简化思路及案例在线程中的应用

Java中的匿名内部类及内部类的二三事