Java内部类有哪些使用场景?使用时有哪些坑?
什么是内部类?
内部类,顾名思义,就是在一个类内部创建的类。
那么,
- 内部类有哪些使用场景?
- 使用内部类时有哪些坑?
内部类的坑
在内部类中的方法内部,调用外围类类名.this方法会返回当前内部类所连接的外围类对象的引用,如下图:
这有个很合理的解释:内部类如果使用了外部环境的状态,那么,内部类加上创建它的外部环境,就叫做闭包。
什么时候会用到内部类?
隐藏某些实现、多继承、单元测试、闭包问题(即如果一个类继承了某个父类,这个类还想实现一个接口,但是父类和这接口有些方法或属性有冲突,想把父类和接口的功能都保留下来,那么,就可以用内部类来配合,用接口加内部类来实现闭包)
继承内部类时有哪些坑?
继承自内部类时,使用默认的构造器会报错,因为内部类会默认的获得指向其外部类对象的引用,所以继承内部类时应该在构造器参数中传递一个其外部类对象的引用(编译器要求你一定要这样做),然后在构造器中使用该外部类对象引用的super方法(该super方法调用的是这个外部类对象的内部类的构造方法)。如果父类和接口都有一个方法,他们的方法签名相同,那么子类中的这个方法,既是父类方法的重写又是接口方法的实现。如下面2个图,
内部类的构造器和其他方法都会默认传递一个外围类对象做参数,如:
去掉这个内部类的无参构造器时,则用反射获取不到其构造器(即,不显式的定义内部类构造器,使用反射就获取不到内部类的构造器【有参无参均获取不到】),显式的定义一个无参构造器,则可以获取到使用了外部类对象当做其默认参数的内部类构造器。
原创文章多多支持!欢迎关注!