![966cbf80924634d0cb66ae8bf5cc6d48.png](https://i-blog.csdnimg.cn/blog_migrate/6f11fe266f83c3afc7a5a5b56fbfc318.jpeg)
内部类
1.什么是内部类
内部类:定义在其他类内部的类
内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类
内部类在编译后会生成一个class文件,文件名命名为:
外部类名$内部类名.class
注意:内部类与外部类只在编译时有关联关系,编译结束后二者不再有包含关系
2.成员内部类
- 定义在外部类的成员(属性、方法)位置
- 可以使用四种访问权限修饰符修饰内部类
- 可以在内部类的内部定义属性和方法
成员内部类示例:
![485dae1b944f12f8751d67e0d581f798.png](https://i-blog.csdnimg.cn/blog_migrate/65a08ae2b5d0bd227e66c0618c5bf771.png)
创建内部类对象:先要创建外部类对象,然后使用外部类对象创建内部类对象
![0e81d1490e5435da9b2df4ef4a3e1e8b.png](https://i-blog.csdnimg.cn/blog_migrate/ed501b5134ab20d95ad095afb05caeee.png)
内部类可以有和外部类重名的属性和方法,内部类对象优先访问自己的属性和方法。内部类对象访问外部类对象的属性和方法,可以使用:
- 外部类名.this.外部类属性
- 外部类名.this.外部类方法(参数)
![34354aee4e94bcd3b1e44edf36a826ff.png](https://i-blog.csdnimg.cn/blog_migrate/b8cf647d0ff90bbeedd48a06008f8581.png)
成员内部类能不能定义静态属性?
成员内部类属于外部类对象,类的静态属性先于对象被创建,内部类静态属性被创建时还没有外部类对象,因此成员内部类不能有静态属性或方法。
3.静态内部类
- 使用static修饰符修饰的成员内部类
- 创建静态内部类的对象不需要创建外部类对象
- 只能访问外部类静态的属性或方法
成员内部类示例:
![e49bff28e11a9147e0d7ce532e1d7ed9.png](https://i-blog.csdnimg.cn/blog_migrate/e7b7fc4d8cc7b511e7fb2a968676cee0.png)
创建静态内部类:不需要创建外部类对象
![110a2b16309a90434aeeb334ed90bf03.png](https://i-blog.csdnimg.cn/blog_migrate/2e10002624c35001d805bdfe7b00eea3.png)
4.局部内部类
- 方法内部定义的内部类
- 作用范围等同于局部变量
- 不能在作用范围以外创建对象
- 可以访问外部类的属性和方法
局部内部类示例:
![59153f3f0f9ec3672eb4c74ad65c1644.png](https://i-blog.csdnimg.cn/blog_migrate/7144bf44f6100b5d65f29e252efc4177.jpeg)
创建局部内部类:定义在其它方法中的局部内部类无法在主方法中创建对象
![0e1730afdd4832151dfebd00d8234577.png](https://i-blog.csdnimg.cn/blog_migrate/eb0e1b8f6223d4aacc5dedfda3feeccd.png)
局部内部类、方法的形参和局部变量在方法结束后都会消失, 但是局部内部类的对象不会消失,所以如果局部内部类的对象 访问的形参和局部变量必须使用final修饰符修饰。
JDK1.8取消了此限制。
5.匿名内部类
匿名内部类示例:
![4b73b16d91abc7c7bee3c07c2c78a96b.png](https://i-blog.csdnimg.cn/blog_migrate/eb47374bc90060515d83bef69f7a7120.jpeg)
匿名内部类:没有类名,实现抽象类或接口
使用类、抽象类和接口可以创建匿名内部类,匿名内部类相当于在方法中声明的局部内部类,只是没有名字,只知道它的父类或实现的接口的名字。如果父类或实现的接口中有抽象方法,则匿名内部类必须实现所有的抽象方法。
使用匿名内部类的条件:
- 特殊的局部内部类,所有局部内部类的特征匿名内部类全有
- 必须知道它的父类或实现的接口
- 只创建该类的一个对象
匿名内部类能不能定义构造方法?
匿名内部类不知道类名,所以不能定义构造方法,只能使用默认无参的构造方法。