内部类

一前言:

在开发中常常遇到内部类,但对一些概念不清晰.做下梳理,并添加一些实践心得.
其他很多场景都会使用内部类,我们在看到使用内部类或者想使用的时候要对其有很清晰的认识.编码清晰性很关键.

参考java提高篇(八)----详解内部类,在此基础上加自己的整理.

二基本概念:

在一个类(a)中定义一个类(b).a为外部类,b为内部类.
Java中类不支持多继承,支持多实现.利用内部类可以曲线多继承.
public class Father {}
public class Mother {}
public class Daughter {
class Mother_ extend Mother{}
class Father_ extend Father{}
}

使用内部类还能够为我们带来如下特性(摘自《Think in java》):
1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
3、创建内部类对象的时刻并不依赖于外围类对象的创建。
4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。(不是很理解)
 is a ,是一个。 说明该类是某类的一个特殊例子,简单之为继承。
 has a,有一个。说明该类里含有某个类。简单之为包含,组合。
5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个类(有时候是相互联系的)。编译后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

实例化说明: 人是个类.头可以定义成 简单成员变量 private String xxx,就有局限性.头还有很多功能(方法),那么把头处理成一个类.同时头类不希望其他个体来操控,这个类要方便地使用人的一些对象.
内部类提高了更细微的访问控制.曲道Java多继承.

三.内部类的分类及特性

1.成员内部类
a.成员内部类是依附于外围类,先创建了外围类才能够创建内部类。有从属关系,成员内部类中不能static的变量和方法.
b.内部类作为内部类的一个成员,用外部类对象.new 内部部类()获得能获得(指访问限制private等)的外部类实例.
c.推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时

     return new InnerClass1();
 } ```
d.便捷访问外部类对象和方法,即使私有.内部类对象会持有一个指向外围类对象的引用,可以用这个引用来调用外围类的成员。这个引用明着写为外部类.this.编译就已确定,无运行时成本.
e.外部类要访问内部类的对象和方法则需要通过内部类实例来访问.
f.内部类有与外部类同名对象时,如果不指定为外部类.this,默认为内部类成员.

2.局部内部类
局部内部类是在方法或者作用域内定义,只能在此方法或者作用域被实例化与调用.
局部内部类中不能有访问限定修饰.类中的方法可以有访问限定修饰.但是并无意义,内部类能实例化,就能调用它的对象与方法,即使是私有的.
局部内部类能访问外部类的对象与方法,能访问方法内final成员变量与参数.
局部内部类中不能有static修饰的变量.
3.静态内部类
static修饰的内部类称之为静态内部类,非静态内部类在编译完成之后会隐含地保存着一个引用(外部类.this),该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:
   1. 创建是不依赖外部类。
   2.不能访问外部类的非static对象和方法;
Android中常用来静态内部继承Handle防止内存泄露,因为不会持有外部类(如:Activity)的引用.同时在内部类实例方法的时候将Activity实例传入,使用弱引用包装,就能访问外部类的所有对象与方法.
形似内部,神似外部。
它与定义在外部的静态类用法上相似,区别在于静态内部类与外部类有从属的强联系.这体现在设计与语义上.其他地方引用外部类.静态内部类.
4.匿名内部类
Android中事件接口回调会经常使用匿名内部类.
1.匿名内部类无名字,无构造方法.
2.匿名内部类对接口的实现.返回一个接口的实现实例.形式为new 接口名(){方法实现}
3.可以看做特殊的局部内部类.

你可能感兴趣的:(内部类)