概念:JDK1.1以上版本都支持一个类作为其他类的成员,既可以在语句块中局部定义,也可以在表达式中匿名定义:
内部类具有如下属性:
- 类名只能在定义的方位类被使用,内部类的名称必须区别于外部类;
- 内部类可以使用外部类的类变量和实例变量,亦可以使用外部类的局部 变量;
- 内部类可以定义为abstract类型;
- 内部类可以是一个接口,这个接口必须由另外一个内部类来实现;
- 内部类可以被定义为private或者protected类型,当一个类中嵌套另一个类时,访问保护并不妨碍内部类使用外部类的成员;
- 被定义为static的内部类将自动转换为顶层类,它们不能再使用局部范围中或其它内部类中的数据和变量;
- 内部类中不能定义static型成员,而只有顶层类才能定义static型成员。 如果内部类需要使用static型成员,这个成员必须在外部类中加以定义。
举个栗子:
public class TwoListenInner {
private Frame f;
private TextField tf;
public static void main(String[] args){
TwoListenInner that = new TwoListenInner();
that.go();
}
private void go() {
f = new Frame("Two listeners example");
f.add("North",new Label("Click and drag the mouse"));
tf = new TextField(30);
f.add("South",tf);
f.addMouseMotionListener(new MouseMotionHandler());
f.addMouseListener(new MouseEventHandler());
f.setSize(300,200);
f.setVisible(true);
}
//MouseMotionHandler为一个内部类
public class MouseMotionHandler extends MouseMotionAdapter{
@Override
public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging: X = "+e.getX()+"Y = "+e.getY();
tf.setText(s);
}
}
//MouseEventHandler为一个内部类
public class MouseEventHandler extends MouseAdapter{
@Override
public void mouseEntered(MouseEvent e) {
String s = "The mouse entered";
tf.setText(s);
}
@Override
public void mouseExited(MouseEvent e) {
String s = "The mouse has left the building";
tf.setText(s);
}
}
}
程序执行结果如下所示:
匿名类
在定义一个内部类时,也可以将整个类的描述包含在一个表达式的范围里,使用这种方法是在定义了一个匿名类的同时创建了一个对象。例如:
f.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
String s = "Mouse dragging: X =
"+e.getX()+"Y = "+e.getY();
tf.setText(s);
}
});