内部类
在一个类中定义两个类,则其中任何一个类都不在另一个类的内部;如果在类中在定义一个类,则称类中再定义的那个类为内部类,内部类可以分为成员内部类,局部内部类,匿名类。
11.5.1 成员内部类
1.简介
在一个类中使用内部类,可以在内部类中直接存取其所在类的私有成员变量。
承运内部类的语法如下:
public class OutClass{
private class InnerClass{
//......
}
}
在内部类中可以随意使用外部类的成员方法一级变量,尽管他们被修饰为private。但他们可以任意使用外部类的类成员。
内部类的实例一定要绑定在外部类的实例上,若从外部类初始化一个内部类对象,那么内部类对象就会绑定在外部类的对象上。内部类初始化的方式变化与其他类初始化方式相同,都是使用new关键字。
如果在外部类和非静态方法之外实例化内部类对象,需使用外部类。内部类的形式指定该对像的类型。
内部类对象会依赖于外部类对象,除非已经存在一个外部类形象,否则类中不会出现内部类对象。
2.内部类向上转型为接口
如果将一个权限修饰符为private的内部类向上转型为其父对象,或者直接向上转型为一个接口,在程序中完全隐藏内部类的具体实现过程。可以在外部提供一个接口,在接口中声明了一个方法。如果在实现该接口的内部类中实现该接口的方法,就可以定义多个内部类以不同的方式实现接口中的同一个方法,二在一般的类中是不能多次实现接口中同一方法的,二这些技巧经常被应用在Swing编程中,可以在一个类中做出多个不同的响应事件。
非内部类不能被声明为private或protected类型
3.使用this关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类成员变量相同时可以使用this关键字
在类中,如果遇到内部类与外部类的成员变量重名的情况,可以使用this关键字进行处理;
在内存中所有的对象均被放置在队中,方法一级方法中的形参或局部变量放置在栈中在内部类的对象与外部类的对象是相互依赖的,类名.this对象指向外部类的对象
11.5.2 内部局部类
内部类不仅可以在类中进行定义,也可以在类的局部位置定义,如在类的方法或任意的作用域中均可以定义内部类.
在内部局部类方法的外部不能方法该内部类,但该内部类可以访问当前代码块的常量一级此外部类的所有成员。
如果在方法体中使用局部变量,该剧不变量需要设置为final类型,换句话说,在方法中定义的内部类智能访问方法中的final类型的局部变量,这是因为在方法中定义局部变量相当于一个常量,他的生命周期远远超过方法的愿你选哪个周期,由于该局部变量被设置为final,所以不能在内部类中改变该剧不变量的值.
11.5.3 匿名内部类
在方法中首先返回一个outerinterface2的引用,然后在return语句中插入一个定义内部类的代码,由于这个类没有名称,所以将该内部类称为匿名内部类。此类的作用就是创建一个实现与OutInerface接口的匿名类的对象
匿名类的所有实现代码都需要在大括号之间进行编写,语法如下:
return new A{
...//内部类体
}
其中A指的是类名
由于匿名内部类没有名称所有匿名内部类使用默认的构造方法类生成OuterInterface2对象,在匿名内部类定义阶段狐猴,需要加分号进行便是,这个分号你代表内部类的结束,二十代表OuterInterface2引用表达式的创建。
匿名内部类编译后,会产生以“外部类名$序号”为名称的.class文件,序号以1n排列,分别代表1n个匿名类。
11.5.4 静态内部类
在内部类前加修饰符static,这个累就编程内部静态类了;一个静态内部类中可以声明static成员,但是在非静态内部类中不可声明静态成员。
静态内部类的最大特点就是不可以使用外部类的非静态成员,所以静态内部类在程序开发中较为少见。
可以这样认为,普通的内部类对象一四年hi的在外部保存了一个引用,只想创建他的外部类对象,但如果内部类被定义为static 就会有更多限制,静态内部类具有一下特点:
如果创建静态内部类的对象不需要其外部类对象
不能从静态内部类的对象中访问非静态外部类的对象
11.5.5 内部类继承
内部类和普通类一样,可以被继承,但是内部类的继承较为复杂,需要设置专门的语法来完成。
在某个类继承内部类时,必须硬性的给予这个类一个带参数构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造体中使用a.super();语句,这样才为继承提供了必要的对象引用。