匿名内部类
- 概念:即内部类的简化写法
- 前提:存在一个类(可以是具体类也可以是抽象类)或接口
- 格式:new 类名或接口名{重写的方法}
- 本质:创建的是继承了类或实现了接口的子类匿名对象。
内部类
匿名类是内部类,首先看一下什么是内部类。根据内部类的不同位置,可将内部类分为:
- 成员内部类
- 局部内部类(位于外部类方法内)
1 | class C{ |
1. 成员内部类的访问格式:C.B b = new C().new B()
实际开发中,常将内部类设为私有成员以保护数据安全。
1 | class C{ |
或者,将内部类设置为静态类。 静态内部类在访问外部类成员时,只能访问外部类的静态成员。
private让数据更安全,static让数据访问更方便
1 | class Outer{ |
2. 局部内部类
可以直接访问外部类的成员。 局部内部类访问的外部变量必须定义为final或static类型。
内部类和外部类其实是处于同一级别的,局部内部类不会因为方法的执行完毕而销毁。那么问题就来了:
- 如果外部类的方法中的变量不定义为final,当外部类方法执行完毕的时候,这个变量就被销毁了。 然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。 【在多线程工作时经常出现】如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话final修饰的值始终无法改变,这个变量所指的内存区域就不会改变。
匿名内部类
- 概念:即内部类的简化写法
- 前提:存在一个类(可以是具体类也可以是抽象类)或接口
- 格式:new 类名或接口名{重写的方法}
- 本质:创建的是继承了类或实现了接口的子类匿名对象。
1 | 匿名类的声明是由java编译器自动派生一个类实例创建表达式。 |
匿名类的语法:
1 | Runnable hello = new Runnable(){ //1.new操作符; 2.接口名称 3. ()中构造函数的参数列表。 |
访问权限:
- 外部class里的字段
- 不能访问外部类的本地变量,除非是final
- 如果内部类的名称与外部能访问的名称相同,就近原则。
- 不能定义静态初始化代码块
- 不能在匿名类里定义接口
- 不能再匿名类里定义构造函数
匿名类方法的访问:
1 | 方法1:直接在new 匿名类后边加.method()。这样访问如果方法多了调用很麻烦 |
匿名类在开发中,一般是方法参数为接口的情况:
1 | interface D{ |