文档

Java™ 教程
学习路径: 学习Java语言
课程: 类和对象
主页 > 学习Java语言 > 类和对象

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

问题

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

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

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

    1. 问题: Box 定义了哪个静态嵌套类?

      答案: Box.Filler

    2. 问题: Box 定义了哪个内部类?

      答案: Box.AccessibleBox

    3. 问题: Box 的内部类的超类是什么?

      答案: [java.awt.]Container.AccessibleAWTContainer

    4. 问题: 在任何类中,你可以使用 Box 的哪个嵌套类?

      答案: Box.Filler

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

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

练习题

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

    答案InnerClass1: 调用了getString方法。
    InnerClass1: 调用了getAnotherString方法。

  2. 练习:下面的练习涉及修改类DataStructure.java,该类在内部类示例一节中进行了讨论。

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

      提示:如果你在main方法中指定这些语句,它们将无法编译:

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

      当编译器遇到表达式new EvenIterator()时,会生成错误消息"non-static variable this cannot be referenced from a static context"。类EvenIterator是一个非静态的内部类。这意味着你只能在外部类DataStructure的实例内部创建EvenIterator的实例。

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

    2. 调用方法print(DataStructureIterator iterator),使其打印具有奇数索引值的元素。使用匿名类作为方法的参数,而不是DataStructureIterator接口的实例。

      提示:你不能从DataStructure类外部定义的匿名类访问私有成员SIZEarrayOfInts

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

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

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

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

    4. 定义两个方法,这些语句将打印具有偶数索引值的元素,然后打印具有奇数索引值的元素:

      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


上一页:问题和练习:嵌套类