文档

Java™ 教程-Java Tutorials 中文版
Trail: Learning the Java Language
Lesson: Classes and Objects
主页>学习 Java 语言>类和对象

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

问题

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

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

  2. 使用 Box 类的 Java API 文档(在 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. Exercise:获取文件 Class1.java。编译并运行 Class1。输出是什么?

    答案: InnerClass1:调用了 getString。
    InnerClass1: getAnotherString invoked.

  2. Exercise:以下练习涉及修改类 DataStructure.javaInner Class Example 讨论。

    1. 定义名为 print(DataStructureIterator iterator) 的方法。使用类 EvenIterator 的实例调用此方法,以便它执行与方法 printEven 相同的功能。

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

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

      当遇到表达式 new EvenIterator() 时,编译器会生成错误消息 "非静态变量,这不能从静态上下文引用"。类 EvenIterator 是一个内部的非静态类。这意味着你只能在外部类的实例 DataStructure 中创建 EvenIterator 的实例。

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

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

      Hint:你无法访问类 DataStructure 之外的私有成员 SIZEarrayOfInts,这意味着你无法访问这些私有成员来自 DataStructure 之外定义的匿名类。

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

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

      Hint:在此 print 方法中,你可以使用 for 表达式逐步执行数组 arrayOfInts 中包含的元素。对于每个索引值,调用方法 function.apply。如果此方法返回特定索引值的 true 值,则打印该索引值中包含的元素。

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

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

      DataStructure ds = new DataStructure()
      // ...
      ds.print(DataStructure::isEvenIndex);
      ds.print(DataStructure::isOddIndex);

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

    答案:参见文件 DataStructure.java


Previous page: Questions and Exercises: Nested Classes