# 内部类示例

> 原文： [https://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html](https://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html)

要查看正在使用的内部类，首先要考虑一个数组。在下面的示例中，您将创建一个数组，用整数值填充它，然后仅按升序输出数组的偶数索引值。

以下 [`DataStructure.java`](examples/DataStructure.java) 示例包括：

*   `DataStructure`外部类，包括用于创建`DataStructure`实例的构造函数，该实例包含填充有连续整数值（0,1,2,3 等）的数组，以及打印数组元素的方法具有均匀的索引值。
*   `EvenIterator`内部类，实现`DataStructureIterator`接口，扩展 [`Iterator`](https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html) `&lt;` [`Integer`](https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html) `&gt;`接口。迭代器用于逐步执行数据结构，并且通常具有测试最后一个元素，检索当前元素以及移动到下一个元素的方法。
*   实例化`DataStructure`对象（`ds`）的`main`方法，然后调用`printEven`方法打印具有偶数索引值的数组`arrayOfInts`的元素。

```

public class DataStructure {

    // Create an array
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        // fill the array with ascending integer values
        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();
    }

    interface DataStructureIterator extends java.util.Iterator<Integer> { } 

    // Inner class implements the DataStructureIterator interface,
    // which extends the Iterator<Integer> interface

    private class EvenIterator implements DataStructureIterator {

        // Start stepping through the array from the beginning
        private int nextIndex = 0;

        public boolean hasNext() {

            // Check if the current element is the last in the array
            return (nextIndex <= SIZE - 1);
        }        

        public Integer next() {

            // Record a value of an even index of the array
            Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);

            // Get the next even element
            nextIndex += 2;
            return retValue;
        }
    }

    public static void main(String s[]) {

        // Fill the array with integer values and print out only
        // values of even indices
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}

```

输出是：

```
0 2 4 6 8 10 12 14 

```

请注意，`EvenIterator`类直接引用`DataStructure`对象的`arrayOfInts`实例变量。

您可以使用内部类来实现帮助程序类，例如本示例中显示的帮助程序类。要处理用户界面事件，您必须知道如何使用内部类，因为事件处理机制会广泛使用它们。

## 本地和匿名类

还有两种类型的内部类。您可以在方法体内声明内部类。这些类称为[本地类](localclasses.html)。您还可以在方法体内声明内部类，而无需命名该类。这些类称为[匿名类](anonymousclasses.html)。

## 修饰符

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