# 内部类范例

要看到正在使用的内部类,首先考虑一个数组。在下面的示例中,创建一个数组,用整数值填充数组,然后按升序排列数组的均匀索引值。

  • DataStructure 外部类,在构造函数中用连续的整数填充数组
  • EvenIterator 内部类,实现了 DataStructureIterator 接口,它扩展了接口。迭代器用于遍历数据结构,通常具有测试最后一个元素的方法,检索当前元素,兵移动到下一个元素。
  • main 方法 测试
public class DataStructure {
    // 创建数组
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        // 填充数组
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }

    public void printEven() {

        // Print out values of even indices of the array
        DataStructureIterator iterator = this.new EvenIterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
    }

    // 扩展一个自定义的 Iterator
    interface DataStructureIterator extends java.util.Iterator<Integer> {
    }

    private class EvenIterator implements DataStructureIterator {

        // 从头开始遍历数组
        private int nextIndex = 0;

        @Override
        public boolean hasNext() {

            // 检查当前元素是否是数组中的最后一个元素
            return (nextIndex <= SIZE - 1);
        }

        @Override
        public Integer next() {

            // 记录当前索引的值
            Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);

            // 获取下一个偶数元素
            nextIndex += 2;
            return retValue;
        }
    }

    public static void main(String s[]) {
        // 打印偶数项索引的值
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

输出为

0 2 4 6 8 10 12 14
1

请注意,EvenIterator 使用 arrayOfInts 方法引用 DataStructure 对象的实例变量。

您可以使用内部类来实现助手类,如本例中所示的类。要处理用户接口事件,您必须知道如何使用内部类,因为事件处理机制可以广泛使用它们。

# 本地和匿名类

还有两种类型的内部类。您可以在方法体内声明一个内部类。这些类被称为 本地类。您也可以在方法正文中声明一个内部类,而不必命名该类。这些类被称为 匿名类

# 修饰符

您可以对外部类的其他成员使用内部类使用相同的修饰符。例如,您可以使用访问修饰符 private、public 和 protected 限制对内部类的访问,就像使用它们来限制对其他类成员的访问一样。