天天看点

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

通过【Java多态十六:匿名内部类】这篇博文给出的范例可知,匿名内部类可应用于这种场景:一个接口A、或一个抽象类B中定义了一个未实现的方法a(自然一个普通类C的已经实现了的方法也行,这样的话就是重写了),在其另一个类D中,需要调用这个方法a,这个时候就可以在类D的调用这个方法的地方使用匿名内部类的策略,完成对方法a的具体实现,以完成具体的功能调用。

可以发现,上面的过程并没有写出包含a方法具体实现的匿名类的名字,也没有该匿名类的实例对象(即并没有写抽象类的子类或接口的实现类),,,但通过系统浏览器可以发现,在程序编译后,有该匿名内部类的.class文件。

所以,(鉴于目前对类加载机制不熟悉的情况下)可以认为,该匿名内部类是在内存中实际存在的,是有一个匿名内部类的实体的。即也可以认为匿名内部类是一种简略的方式,一种节省的方式(如上,就省去了创建子类或实现类)。一种现用现写的方式。

也可以发现,前几节所说的成员内部类、静态内部类、方法内部类、匿名内部类均是在类中说的。其实,不仅类里面可以有内部类,接口也可以有内部类,那么对于成员内部类、静态内部类、方法内部类、匿名内部类这四个内部类在接口中的情况,是这篇博文的主要的内容。

1.接口中为什么需要内部类:

注:接口中为什么需要内部类是理解这部分的核心

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

2.接口中成员内部类之普通成员内部类

接口:

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

接口的实现类:可以发现在实现类中,接口中的普通成员内部类是可以被实现类访问的到的

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

实测:调用接口中的普通成员内部类中定义的show()方法

注意:(1)第一种通过接口获取接口中普通成员内部类实例对象的方法。(独立记忆即可,不要和类中的内部类获取实例对象相混淆)

           (2)接口中的内部类可以import导入(这点表明,接口中的普通成员内部类可以在不借助于接口的情况下被外部访问;而对于类中的内部类来说,必须接口外部类才能访问内部类)

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

3.接口中成员内部类之抽象成员内部类

接口:

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

实现类:发现在实现类中定义了一个成员内部类AbDemo来继承接口中的抽象成员内部类AbInnerClass,然后在该子类中实现了抽象成员内部类中的抽象方法abInfo()。

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)

调用接口中抽象成员内部类方法的策略:

(1)第一种策略:抽象成员内部类的本来应该有一个实现类,这儿把这个实现类匿名了,(即在略微不同的场景中使用了匿名内部类,然后把采用了匿名内部类策略处理后的抽象类复赋值给了abInner,注意这种“新的”用法吧)(这种策略目前在说服自己理解上还存在模糊)

(2)第二种策略:单纯是在接口的实现类中,采用成员内部类的方法,使实现类中的成员内部类继承接口中的抽象成员内部类,从而实现抽象成员内部类的抽象方法,完成功能的调用。

Java多态十七:接口中为什么需要内部类,接口中常见的内部类为成员内部类(包括普通成员内部类、和抽象成员内部类)