Java内部类有哪些使用场景?使用时有哪些坑?

createh55个月前 (12-16)技术教程48

什么是内部类?

内部类,顾名思义,就是在一个类内部创建的类。

那么,

  1. 内部类有哪些使用场景?
  2. 使用内部类时有哪些坑?

内部类的坑

在内部类中的方法内部,调用外围类类名.this方法会返回当前内部类所连接的外围类对象的引用,如下图:

这有个很合理的解释:内部类如果使用了外部环境的状态,那么,内部类加上创建它的外部环境,就叫做闭包

什么时候会用到内部类?

隐藏某些实现、多继承、单元测试、闭包问题(即如果一个类继承了某个父类,这个类还想实现一个接口,但是父类和这接口有些方法或属性有冲突,想把父类和接口的功能都保留下来,那么,就可以用内部类来配合,用接口加内部类来实现闭包)

继承内部类时有哪些坑?

继承自内部类时,使用默认的构造器会报错,因为内部类会默认的获得指向其外部类对象的引用,所以继承内部类时应该在构造器参数中传递一个其外部类对象的引用(编译器要求你一定要这样做),然后在构造器中使用该外部类对象引用的super方法(该super方法调用的是这个外部类对象的内部类的构造方法)。如果父类和接口都有一个方法,他们的方法签名相同,那么子类中的这个方法,既是父类方法的重写又是接口方法的实现。如下面2个图,


内部类的构造器和其他方法都会默认传递一个外围类对象做参数,如:

去掉这个内部类的无参构造器时,则用反射获取不到其构造器(即,不显式的定义内部类构造器,使用反射就获取不到内部类的构造器【有参无参均获取不到】),显式的定义一个无参构造器,则可以获取到使用了外部类对象当做其默认参数的内部类构造器。


原创文章多多支持!欢迎关注!


好书推荐!Java界公认的权威书籍!坚持读完,轻松拿下阿里巴巴offer!下方链接直接京东自营购买!

相关文章

Redis实现应用程序访问量、用户在线人数、文章阅读量统计

Redis具有原子性的操作,可以在并发环境下安全地对计数器进行增加或减少操作。这使得Redis非常适合实现应用程序访问量、用户在线人数、文章阅读量等计数功能。使用非常简单,步骤如下:配置Redis连接...

导致程序出现OOM的因素,夜深人静的时候,程序OOM异常追踪

  认真写文章,用心做分享。公众号:Java耕耘者 ??文章都会在里面更新,整理的资料也会放在里面。 作为Java程序员, 除了享受垃圾回收机制带来的便利外, 还深受OOM(Out Of Memory...