一、引入嵌套类
在一个类的内部可以定义一个类,这个类就是嵌套类,嵌套类分为静态嵌套类和非静态嵌套类,静态嵌套类由于使用的局限限(下面会讲述),所以很少使用,使用较多的是非静态嵌套类,也就我们说的内部类,内部类的类型可以分为三种:
(1)、在一个类中,直接定义一个内部类;
(2)、在一个类的方法中,定义一个内部类;
(3)、匿名内部类;
二、静态嵌套类
看下面代码:
在一个类中定义静态嵌套类,这个静态嵌套类只能访问外部类的静态成员,这是由java的静态方法只能访问静态成员决定的。外部类不可以直接访问静态嵌套类的成员,因为静态嵌套类默认的使这个类中的方法和变量都是静态的,可以通过这个类的对象来访问变量。静态嵌套类只是对于这个外部类是可见的,对其他的外部类是不可见的。因为静态嵌套类的使用的局限性,所以它很少被使用。
三、非静态嵌套类
非静态嵌套类分为:类内部类,方法内部类以及匿名内部类,它们都有共有的特性,都是独立的一个类,编译后会生成.class文件,前缀有外部类的名称,内部类可以直接访问外部类的行为和属性,外部类方位内部类的行为和属性,需要通过内部类对象。
1、类中定义的内部类
类内部类可以直接访问外部类的方法和变量,外部类要访问内部类的方法和变量需要用内部类的实例去访问,和内部类同级的内部类,访问其他内部类,需要通过内部类的实例访问。内部类的引用对于外部类是可以见的,除了这个外部类,对于其他类来说是不可见,若引用,那么就会编译错误。
2、方法内部类
方法内部类顾名思义就是在方法中定义一个类。
这个类不可以使用方法的非final变量,因为方法的局部变量是存放在栈中的,是随着方法的调用而创建的,调用完局部变量在内存中就消失,而方法中的类的对象使存放在堆中的,有可能被引用到其他代码中,所以内部类的对象的生命周期和方法中的局部变量的生命周期是不一致的,所以内部类不能使用方法的局部变量。
方法中的内部类实例化,只能在方法中实例。
3、匿名内部类
(1)、继承式匿名内部类
(2)、接口式匿名内部类
接口式内部类看上去实例化的接口,其实不然,实际上是实现接口的一个匿名内部类。
(3)、传入参数匿名内部类
定义了两个类,一个接口,一个类的参数是接口对象,一个类实例化另一个类并调用它的方法,方法的传入的参数就是匿名内部类。