1.定义
内部类即定义在一个类体内部的类,内部类被编译器编译成OuterClass$InnerClass.class 。
class OuterClass { private int value; private class InnerClass { } }
2.特性
(1)内部类可以访问外部类的属性和方法,包括private的属性和方法。
(2)内部类可以使用static关键字修饰,可以使用OuterClass.InnerClass来访问static的内部类。static的内部类只能访问外部类的static属性和方法。
(3)通常是在外部类中创建内部类对象使用内部类,要在其他类中创建内部类对象:
如果内部类是非static的,则需要通过一个外部类对象来创建内部类对象,如:OuterClass.InnerClass innerObj = outerObj.new InnerClass;
如果内部类是static的,则需要通过OuterClass.InnerClass来创建内部类对象,不能再通过一个外部类对象来创建,如:OuterClass.InnerClass innerObj = new OuterClass.InnerClass 。
3. 局部内部类
如果一个内部类只在某个方法中使用了,则可以将这个内部类定义在该方法中,即局部内部类。局部内部类不能使用public或者private修饰。
局部内部类除了能访问外部类的属性和方法,还能访问所在方法中的局部变量,但这些变量必须是final的。
class OuterClass { private int value; public void method() { class LocalClass { } } }
4. 匿名内部类
匿名内部类在局部内部类的基础上更加简化了,假如在定义局部内部类的方法中只创建该局部内部类的一个对象,则就不再需要给该局部内部类命名。匿名内部类一般和接口结合在一起使用:
class OuterClass { public void method() { new ActionListener() { //该匿名类实现了ActionListener接口
public void actionPerformed(ActionEvent e)
{
}
}; } }
5. 用处
(1)内部类可以对同一个包中的其他类隐藏起来
(2)当想要定义一个回调函数而又希望尽量少写代码时,可以使用匿名内部类。Java中的回调是通过对象实现的,传递一个对象的引用,然后在适当的时候调用对象中的某个方法实现回调函数的功能。
参考资料 《Java核心技术》