在一个.java源文件中,只能定义一个类名与文件名完全一致的公开类,使用public class关键字来修饰。但在面向对象语言中,任何一个类都可以在内部定义另外一个类,前者为外部类,后者为内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。比如,属性字段private static String str,由访问控制符、是否静态、类型、变量名组成,而内部类private static class Inner{},也是按这样的顺序来定义的,类型可以为class、enum、甚至是interface,当然在内部类中定义接口是不推荐。内部类可以是静态和非静态的,它可以出现在属性定义、方法体和表达式中,甚至可以匿名出现,具体分为如下四种。
·静态内部类,如:static class StaticInnerClass{};
·成员内部类,如:private class InstanceInnerClass{};
·局部内部类,定义在方法或者表达式内部;
·匿名内部类,如:(new Thread(){}).start()。
如下是最精简的4种内部类定义方式:
点击查看代码
public class OuterClass {
// 成员内部类
private class InstanceInnerClass {}
// 静态内部类
static class StaticInnerClass {}
public static void main(String[] args) {
// 两个匿名内部类,分别对应图2-1所示的OuterClass$1和OuterClass$2
(new Thread(){}).start();
(new Thread(){}).start();
// 两个方法内部类,分别对应图2-1所示的OuterClass$1MethodClass1和
// OuterClass$1MethodClass2
class MethodClass1{}
class MethodClass2{}
}
}
点击查看代码
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;
}