Java匿名内部类详解

 一、在使用匿名内部类的过程中,我们需要注意如下几点:

      1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

      2、匿名内部类中是不能定义构造函数的。

      3、匿名内部类中不能存在任何的静态成员变量和静态方法。

      4、匿名内部类为局部内部类(即方法内部类),所以局部内部类的所有限制同样对匿名内部类生效。

      5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

二、静态内部类详解

 静态内部类是 static 修饰的内部类,这种内部类的特点是:

  1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问。

  2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员。

  3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

public class Test {
    private int a = 99 ; //外部类私有变量
    static int b = 77 ;   //外部类的静态变量

    //定义静态内部类
    private static class SInner {
        private int c = 66 ; //
        public void test(){
            System.out.println("访问外部类的b: "+Test.b);
            System.out.println("访问外部类的私有变量a : "+new Test().a);
        }
    }

    public static void main(String[] args) {
        SInner sInner = new SInner() ;
        System.out.println("访问内部类的私有变量c: "+sInner.c);
        sInner.test();
    }
}

  

结果:

访问内部类的私有变量c: 66
访问外部类的b: 77
访问外部类的私有变量a : 99

Process finished with exit code 0

  

三、闭包(Java中的闭包):

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)


What
闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。 —《百度百科》

是引用了自由变量(可以理解为除局部变量以外的变量)的函数。这个函数通常被定义在另一个外部函数中,并且引用了外部函数中的变量。 – <>

是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。– <

简单理解:
闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。

深入理解Java闭包概念

参考:https://blog.csdn.net/yztbydh/article/details/76270708

 参考:https://juejin.cn/post/6844903655510917128

内部类

参考: https://www.cnblogs.com/hysum/p/7101974.html

原文地址:https://www.cnblogs.com/-courage/p/14487968.html