关于“java中静态内部类的设计意图”的理解


欢迎扫描二维码关注公众号《
Android面试专栏》,不定期发布面试题干货分析!!

内部类

内部类,即定义在一个类的内部的类。为什么有内部类呢?

我们知道,在java中类是单继承的,一个类只能继承另一个具体类或抽象类(可以实现多个接口)。这种设计的目的是因为在多继承中,当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承。

而使用内部类的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。


静态内部类

说静态内部类之前,先了解下成员内部类(非静态的内部类)。

成员内部类

成员内部类也是最普通的内部类,它是外围类的一个成员,所以它可以无限制的访问外围类的所有成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。

在成员内部类中要注意两点:

  • 成员内部类中不能存在任何static的变量和方法;

  • 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

静态内部类

静态内部类与非静态内部类之间存在一个最大的区别:非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。

没有这个引用就意味着:

  • 它的创建是不需要依赖于外围类的。

  • 它不能使用任何外围类的非static成员变量和方法。


其它两种内部类:局部内部类和匿名内部类

局部内部类

局部内部类是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

匿名内部类

1、匿名内部类是没有访问修饰符的。

2、new 匿名内部类,这个类首先是要存在的。

3、当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。

4、匿名内部类没有明面上的构造方法,编译器会自动生成一个引用外部类的构造方法。


-----------------------


本文原创发布于公众号《Android面试专栏》,欢迎大家回复留言投稿!


你可能感兴趣的:(java)