Java中允许在一个类中声明另一个类,这样的类称为内部类(Inner Class),也称为嵌套类(Nested Class),而包含内部类的类称为外部类。
内部类仍然是一个独立的类,在编译之后的内部类会被编译成独立的class文件,但是前面冠以外部类的类名和$符号。内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是否是private的。内部类有4种形式。
一、成员内部类
不用static修饰的内部类,称为成员类,其地位就像是一个实例方法,可存取所在类的所有字段与方法。成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;而需要创建内部类对象,可以使用outer.inner obj = outerobj.new inner();
成员内部类可用的修饰符有final、abstract、public、private、protected;当它使用static修饰时,它就成了静态内部类。
二、静态成员类
静态内部类的地位处于外部类内部的顶层,所以又称为嵌套顶层类。(内部类中的特殊情况:接口只能定义为类中的静态成员。)
一个静态内部类中可以定义任何静态或非静态的成员,但是在非静态内部类中不能声明静态成员静态内部类有一个最大的特点,就是不可以使用外部类的非静态成员。静态内部类的访问:如果创建静态内部类的对象,不需要其外部类的对象;不能从静态内部类的对象中访问非静态外部类的对象。
静态内部类里的静态方法中,可以直接访问该类和外部类的静态成员,但是在访问其他成员是需要通过创建对象;对于非静态方法,可以直接访问该类中的所有成员和外部类中的静态成员,访问外部类的其他成员需要创建类对象。
三、局部类
局部类的地位与局部变量相同,存在于某一成员或代码块中,有自己的作用域,即只能在自己的局部内实例化,不能在作用域外实例化。局部类不能使用局部类所在方法的非final修饰的局部变量。局部内部类的修饰符只有final和abstract。静态方法中的局部类:由于静态方法没有this引用,静态方法内的内部类只能访问外部类的静态成员。
四、匿名类匿名类指没有名称的内部类,内部类实际上是一个类的实例。匿名内部类一般用在继承抽象类、实现接口时,由于抽象类于接口不能实例化,所以用匿名内部类来继承或实现,同时重写父类的方法,当在方法内或在参数传递中时需要一个抽象类或接口的实例,而且只使用一次,那么就可以使用匿名内部类。使用方法为new ClassOrInterface(){@Override} 匿名内部类的关键是重写父类或接口的方法。