Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
问题:程序 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
问题:如何创建 Box
的 Filler
类的实例?
答案:new Box.Filler(minDimension, prefDimension, maxDimension)
Exercise:获取文件 Class1.java
。编译并运行 Class1
。输出是什么?
答案: InnerClass1:调用了 getString。
InnerClass1: getAnotherString invoked.
Exercise:以下练习涉及修改类 DataStructure.java
,Inner Class Example 讨论。
定义名为 print(DataStructureIterator iterator)
的方法。使用类 EvenIterator
的实例调用此方法,以便它执行与方法 printEven
相同的功能。
Hint:如果在 main
方法中指定它们,则不会编译这些语句:
DataStructure ds = new DataStructure(); ds.print(new EvenIterator());
当遇到表达式 new EvenIterator()
时,编译器会生成错误消息 "非静态变量,这不能从静态上下文引用"。类 EvenIterator
是一个内部的非静态类。这意味着你只能在外部类的实例 DataStructure
中创建 EvenIterator
的实例。
你可以在 DataStructure
中定义一个方法,该方法创建并返回 EvenIterator
的新实例。
调用方法 print(DataStructureIterator iterator)
,以便打印具有奇数索引值的元素。使用匿名类作为方法的参数,而不是接口 DataStructureIterator
的实例。
Hint:你无法访问类 DataStructure
之外的私有成员 SIZE
和 arrayOfInts
,这意味着你无法访问这些私有成员来自 DataStructure
之外定义的匿名类。
你可以定义访问私有成员 SIZE
和 arrayOfInts
的方法,然后在匿名类中使用它们。
定义名为 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
)。
定义两个方法,以便这些语句打印具有偶数索引值的元素,然后打印具有奇数索引值的元素:
DataStructure ds = new DataStructure() // ... ds.print(DataStructure::isEvenIndex); ds.print(DataStructure::isOddIndex);
Hint:在类 DataStructure
中创建名为 isEvenIndex
和 isOddIndex
的两个方法,它们具有相同的参数列表和返回类型作为抽象方法 Boolean Function<Integer, Boolean>.apply(Integer t)
。这意味着这些方法采用一个 Integer
参数(索引)并返回 Boolean
值。
答案:参见文件 DataStructure.java
。