目录
- 为什么要使用内部类
- 内部类的种类
- 普通内部类
- static内部类
- 普通内部类的实例化方式
- 需要借助外部类对象
- 外部类方法中返回(使用new实例化)
- 外部类对象直接new
- 需要借助外部类对象
- 封装内部类
- 实现接口
- 隐藏实现细节
- 不能使用外部类对象new一个实例(类比private属性只能通过方法实例化)
- 匿名内部类
- 定义内部类同时实例化内部类对象
- 内部类的本质
为什么要使用内部类
- 获取外部类成员的访问权限
- 本质是内部类对象拥有外部类对象的引用
- 实现多重继承
内部类的种类
- 普通内部类
- 需要借助外部类对象才能实例化
- 内部类对象拥有外部类对象的引用
- 所以内部类对象可以获得外部类对象的引用
- 通过this关键字
- 就像子类对象拥有父类对象的引用
- 所以子类对象实例化之前,先实例化父类对象
- static内部类
- 不依赖外部类对象即可实例化
普通内部类实例化方式
- 通过在外部类定义方法返回内部类实例
- 使用new关键字(private内部类不能使用此方法)
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
匿名内部类
- 匿名内部类在创建类的同时实例化了对象
- 匿名内部类可以显示定义基类
- 传入匿名内部类的参数必须声明为final(除传入基类的参数外)
- 匿名内部类实例初始化的实际效果就是构造器
内部类的本质
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。