问题和练习的答案:嵌套类
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
- 问题 :如何创建
Box
的Filler
类的实例?
答案 :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
类之外访问私有成员SIZE
和arrayOfInts
,这意味着您不能从DataStructure
之外定义的匿名类访问这些私有成员。
您可以定义访问私有成员SIZE
和arrayOfInts
的方法,然后在匿名类中使用它们。
- 定义一个名为
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
中创建名为isEvenIndex
和isOddIndex
的两个方法,它们具有与抽象方法Boolean Function<Integer, Boolean>.apply(Integer t)
相同的参数列表,并返回类型。这意味着这些方法采用一个Integer
参数(索引)并返回Boolean
值。
答案 :参见文件DataStructure.java。