该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来限制对内部类的访问,就像限制对其他类成员的访问一样。