基础 | Java的内部类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingbeichen/article/details/83588761

「内部类」 在面试时问的并不是很多,但是本人在面试Synopsys时就被问到过,建议还是要重点关注一下。

相信大家对于内部类都不陌生,但肯定也会感觉不太熟悉,因为在开发中的应用场景并不是很多,在此主要梳理一下 「谈谈对内部类的理解?在什么场景中使用过内部类?」 相关问题。


谈谈对内部类的理解?

在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」,如「Outter$1.class」。
  • 匿名内部类一定是在new的后面,仅用于创建该匿名内部类的一个实例。

应用场景:最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。


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

这个问题不好回答,在此简单总结下内部类的优势,大家可以据此分析其实际应用场景。

  • 每个内部类都能独立继承一个父类或一个接口的实现,使得多继承的解决方案更加完整。
  • 方便将存在一定逻辑关系的类组织在一起,又可以对外界进行隐藏(体现封装性)。
  • 方便编写事件监听程序和多线程代码。

扩展面试题

问:成员内部类为什么可以随意访问外部类的成员?

答:编译器会默认为成员内部类添加了一个指向外部类对象的引用,故可在成员内部类中随意访问外部类的成员。(篇幅有限,不再过多赘述,有兴趣可以反编译Java代码查看具体原理。)

问:局部内部类和匿名内部类为何只能访问局部final常量?

答:如果局部变量的值在编译期间就可以确定,则直接在局部内部类或匿名内部类内部创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。限制其只能访问final变量,主要是为了保证数据的一致性。(不太好理解,大家先做一个简单了解,后续有机会再来单独讲讲这个问题吧。)

思考:成员内部类、局部内部类和匿名内部类经编译后的字节码文件名称分别是什么?

留作思考吧。


推荐阅读


欢迎关注

Java名企面试吧,每天10点24分,我们不见不散!

丙子先生的宗旨是,每天以短篇幅讲高频面试题,不增加太多负担,但需要持之以恒。

能力有限,欢迎指教!

猜你喜欢

转载自blog.csdn.net/bingbeichen/article/details/83588761