• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

内部类

技术杂谈 勤劳的小蚂蚁 3个月前 (01-29) 73次浏览 已收录 0个评论 扫描二维码

谈谈对内部类的理解?

在Java中,可以将一个类定义在另一个类里面或一个方法内,这样的类即被称为内部类,其框架体系如下:
下面分别对成员内部类、局部内部类和匿名内部类的具体情况进行详解分析。

谈谈对成员内部类的理解?

成员内部类是最普通的内部类,其定义位于另一个类的内部且在方法外,作为类及类的成员而存在:
  • 作为类,可声明为abstract的,即可以被其他的内部类所继承。
  • 作为类的成员,其可声明为final、static(静态内部类)和abstract的,且与外部类不同的是,内部类可以使用四种访问修饰符进行修饰。
成员内部类如何访问外部类?
答:成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员),使用「this.成员名」调用内部类的成员,使用「外部类名.this.成员名」调用外部类的成员。但需注意,静态内部类只能访问外部的静态成员
外部类如何访问成员内部类?
答:必须先在外部类中创建一个成员内部类的对象,再通过指向该对象的引用来访问内部类的成员。但对于静态内部类和非静态内部类而言,实例化内部类的方式不同:
// 设类ClassA有静态内部类ClassB和普通内部类ClassC
ClassA classA = new ClassA();
ClassA.B classB = new ClassA.B();
ClassA.C classC = classA.new ClassC();
静态内部类与非静态内部类有什么区别?
答:对于静态内部类和非静态内部类的详细区别,建议好好阅读下「关键字static」一文。

谈谈对局部内部类的理解?

局部内部类是定义在一个方法内或一个作用域(如if条件判断代码块)中的类,其和成员内部类的区别在于局部内部类的访问仅限于该方法内或该作用域中。
注意事项:
  • 局部内部类可以访问当前代码块的常量以及其外部类的所有成员。
  • 局部内部类非外部类的成员,故外部类无法访问该内部类。
  • 局部内部类可以看做一个局部变量,不能有public、protected、private和static修饰。

谈谈对匿名内部类的理解?

匿名内部类指没有名字的内部类,故其只能使用一次,通常用来简化代码编写,如Android中为控件添加监听事件。
注意事项:
  • 匿名内部类必须继承一个父类或实现一个接口,进而对继承方法进行实现或重写。
  • 匿名内部类是唯一一种没有构造器的类,其在编译时由系统自动起名为「外部类名$序号.class」,如Outter1.class
  • 匿名内部类一定是在new的后面,仅用于创建该匿名内部类的一个实例。
应用场景:最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。

在什么场景中使用过内部类?

这个问题不好回答,在此简单总结下内部类的优势,大家可以据此分析其实际应用场景。
  • 每个内部类都能独立继承一个父类或一个接口的实现,使得多继承的解决方案更加完整。
  • 方便将存在一定逻辑关系的类组织在一起,又可以对外界进行隐藏(体现封装性)。
  • 方便编写事件监听程序和多线程代码。

扩展面试题

问:成员内部类为什么可以随意访问外部类的成员?
答:编译器会默认为成员内部类添加了一个指向外部类对象的引用,故可在成员内部类中随意访问外部类的成员。(篇幅有限,不再过多赘述,有兴趣可以反编译Java代码查看具体原理。)
问:局部内部类和匿名内部类为何只能访问局部final常量?
答:如果局部变量的值在编译期间就可以确定,则直接在局部内部类或匿名内部类内部创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。限制其只能访问final变量,主要是为了保证数据的一致性。(不太好理解,大家先做一个简单了解,后续有机会再来单独讲讲这个问题吧。)
思考:成员内部类、局部内部类和匿名内部类经编译后的字节码文件名称分别是什么?
留作思考吧

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:内部类
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00