问题和练习的答案:嵌套类

Questions

  • 问题 :程序Problem.java无法编译。您需要做什么才能使其编译?为什么?

答案 :删除Inner类声明前面的static。静态内部类无权访问外部类的实例字段。参见ProblemSolved.java

  • 使用Box类的 Java API 文档(在javax.swing包中)可以帮助您回答以下问题。

  • 问题Box定义了哪些静态嵌套类?

答案Box.Filler

  • 问题Box定义了哪些内部类?

答案Box.AccessibleBox

  • 问题Box内部类的超类是什么?

答案[java.awt.]Container.AccessibleAWTContainer

  • 问题 :您可以从任何类别中使用Box的嵌套类别中的哪一个?

答案Box.Filler

  • 问题 :如何创建BoxFiller类的实例?

答案new Box.Filler(minDimension, prefDimension, maxDimension)

Exercises

  • 练习 :获取文件Class1.java。编译并运行Class1。输出是什么?

答案InnerClass1: getString invoked. InnerClass1: getAnotherString invoked.

  • 锻炼 :以下练习涉及修改内部类示例部分讨论的DataStructure.java类。

  • 定义一个名为print(DataStructureIterator iterator)的方法。使用类EvenIterator的实例调用此方法,使其执行与方法printEven相同的功能。

提示:如果在main方法中指定这些语句,则它们不会编译:

DataStructure ds = new DataStructure();
ds.print(new EvenIterator());

当编译器遇到表达式new EvenIterator()时,将生成错误消息“无法从静态上下文引用的非静态变量”。 EvenIterator类是内部的非静态类。这意味着您只能在外部类DataStructure的实例内部创建EvenIterator的实例。

您可以在DataStructure中定义一个创建并返回EvenIterator的新实例的方法。

  • 调用方法print(DataStructureIterator iterator),以便它打印具有奇数索引值的元素。使用匿名类作为方法的参数,而不是interfaceDataStructureIterator的实例。

提示 :您不能在DataStructure类之外访问私有成员SIZEarrayOfInts,这意味着您不能从DataStructure之外定义的匿名类访问这些私有成员。

您可以定义访问私有成员SIZEarrayOfInts的方法,然后在匿名类中使用它们。

  • 定义一个名为print(java.util.Function<Integer, Boolean> iterator)的方法,该方法执行与print(DataStructureIterator iterator)相同的功能。使用 lambda 表达式调用此方法以打印具有偶数索引值的元素。再次使用 lambda 表达式调用此方法以打印具有奇数索引值的元素。

提示:在此print方法中,您可以使用for表达式逐步遍历数组arrayOfInts中包含的元素。对于每个索引值,调用方法function.apply。如果此方法为特定索引值返回一个真值,则打印该索引值中包含的元素。

要调用此print方法以打印具有偶数索引值的元素,可以指定一个实现方法Boolean Function.apply(Integer t)的 lambda 表达式。此 lambda 表达式采用一个Integer参数(索引)并返回Boolean值(如果索引值为偶数则为Boolean.TRUE,否则为Boolean.FALSE)。

  • 定义两个方法,以使这些语句打印具有偶数索引值的元素,然后打印具有奇数索引值的元素:
DataStructure ds = new DataStructure()
// ...
ds.print(DataStructure::isEvenIndex);
ds.print(DataStructure::isOddIndex);

提示:在类DataStructure中创建名为isEvenIndexisOddIndex的两个方法,它们具有与抽象方法Boolean Function<Integer, Boolean>.apply(Integer t)相同的参数列表,并返回类型。这意味着这些方法采用一个Integer参数(索引)并返回Boolean值。

答案 :参见文件DataStructure.java