一、内部类的分类
内部类主要分为普通内部类、局部内部类、匿名内部类、嵌套内部类(静态内部类)。
非静态内部类中不能定义静态成员,静态内部类不能访问外部类的非静态成员。
1普通内部类(成员内部类)
内部类与普通类的区别:1)内部类的名字是嵌套在外部类中的;2)外部类将有一个方法,该方法返回一个内部类的引用。
如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须以OuterClassName.InnerClassName的形式获取内部类对象的引用。构建内部类引用的时候需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。普通内部类的字段和方法只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,有也不应该包含嵌套类(静态内部类)。
如下代码所示:
/**
* 编写一个名为Outer的类,它包含一个名为Inner的类。在Outer类中添加一个方法,
* 它返回一个Inner类型的对象,在main()中,创建并初始化一个指向某个Inner对象的
* 引用。
*/
public class Excrise1 {
/*定义一个内部类*/
class Inner{
Inner(){
System.out.println("得到一个内部类的引用");
}
}
/*外部类中定义一个返回Inner类型对象的方法*/
public Inner getInner(){
return new Inner();
}
public static void main(String[] args){
Excrise1 e = new Excrise1();
/*在main()中,创建并初始化一个指向某个Inner对象的引用*/
Excrise1.Inner i = e.getInner();//方法一:通过调用外部类返回内部类引用的方法
Excrise1.Inner i2 = e.new Inner();//方法二:利用外部对象引用新建一个内部类对象引用
}
}
2 局部内部类
在方法或者代码的作用域内创建一个完整的类,称作局部内部类,其作用范围为所在的代码块,是内部类中最少使用的一种类型。局部内部类和局部变量一样,不能被public、protected、private和static修饰,只能访问方法中定义为final类型的局部变量。分为静态局部内部类(位于静态方法内或者静态代码块内)和非静态局部内部类。
3 匿名内部类
匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。匿名内部类没有类名的内部类,不使用关键字class、extends、implements,没有构造函数,必须继承其他类或实现其他接口。匿名内部类的好处是代码更加简洁紧凑,但坏处是易读性下降。一般应用于GUI编程中实现事件处理等。
4嵌套内部类
内部类是static时,称作是嵌套类。则1)创建嵌套类的对象时不再需要其外围类的对象;2)不能从嵌套类的对象中访问非静态的外围类对象。
静态内部类不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。
二、使用内部类的好处:
1)内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象那个的信息相互独立;
2)在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类;
3)创建内部类对象的时刻并不依赖于外围类对象的创建;
4)内部类并没有令人迷惑的“is-a”关系,它就是一个独立的实体。