该Java教程针对JDK 8编写。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化以了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以了解所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项的信息。
为了查看内部类的使用方法,首先考虑一个数组。在下面的示例中,您创建一个数组,填充它的整数值,然后仅按升序输出数组的偶数索引值。
下面的示例是DataStructure.java
:
DataStructure
外部类,它包含一个构造函数,用于创建一个包含连续整数值(0、1、2、3等)的数组的DataStructure
实例,以及一个打印具有偶数索引值的数组元素的方法。EvenIterator
内部类,它实现了DataStructureIterator
接口,该接口扩展了Iterator
<
Integer
>
接口。迭代器用于遍历数据结构,通常具有用于检查最后一个元素、获取当前元素和移动到下一个元素的方法。main
方法,它实例化一个DataStructure
对象(ds
),然后调用printEven
方法来打印具有偶数索引值的数组arrayOfInts
的元素。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() { // 打印出数组的偶数索引值 DataStructureIterator iterator = this.new EvenIterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } System.out.println(); } interface DataStructureIterator extends java.util.Iterator<Integer> { } // 内部类实现DataStructureIterator接口, // 该接口扩展Iterator<Integer>接口 private class EvenIterator implements DataStructureIterator { // 从数组的开头开始遍历 private int nextIndex = 0; public boolean hasNext() { // 检查当前元素是否为数组中的最后一个元素 return (nextIndex <= SIZE - 1); } 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(); } }
输出结果为:
0 2 4 6 8 10 12 14
请注意,EvenIterator
类直接引用了DataStructure
对象的arrayOfInts
实例变量。
您可以使用内部类来实现辅助类,就像在这个例子中所示的那样。为了处理用户界面事件,您必须知道如何使用内部类,因为事件处理机制广泛使用了它们。
还有两种额外的内部类类型。您可以在方法体内声明内部类。这些类被称为局部类。您还可以在方法体内声明内部类而不给类命名。这些类被称为匿名类。
您可以为内部类使用与外部类的其他成员相同的修饰符。例如,您可以使用访问修饰符private
、public
和protected
来限制对内部类的访问,就像限制对其他类成员的访问一样。