Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,可能使用已不再可用的技术。
请参阅Java语言变化以了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
问题: 程序 Problem.java
无法编译。你需要做什么才能使其编译通过?为什么?
答案: 删除 Inner
类的声明前面的 static
。静态内部类无法访问外部类的实例字段。参见 ProblemSolved.java
。
使用 Java API 文档的 Box
类(在 javax.swing
包中)来帮助你回答以下问题。
问题: Box
定义了哪个静态嵌套类?
答案: Box.Filler
问题: Box
定义了哪个内部类?
答案: Box.AccessibleBox
问题: Box
的内部类的超类是什么?
答案: [java.awt.]Container.AccessibleAWTContainer
问题: 在任何类中,你可以使用 Box
的哪个嵌套类?
答案: Box.Filler
问题: 如何创建 Box
的 Filler
类的实例?
答案: new Box.Filler(minDimension, prefDimension, maxDimension)
练习:获取文件Class1.java
。编译并运行Class1
。输出是什么?
答案:InnerClass1: 调用了getString方法。
InnerClass1: 调用了getAnotherString方法。
练习:下面的练习涉及修改类DataStructure.java
,该类在内部类示例一节中进行了讨论。
定义一个名为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
的新实例。
调用方法print(DataStructureIterator iterator)
,使其打印具有奇数索引值的元素。使用匿名类作为方法的参数,而不是DataStructureIterator
接口的实例。
提示:你不能从DataStructure
类外部定义的匿名类访问私有成员SIZE
和arrayOfInts
。
你可以定义访问私有成员SIZE
和arrayOfInts
的方法,然后在匿名类中使用它们。
定义一个名为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
)。
定义两个方法,这些语句将打印具有偶数索引值的元素,然后打印具有奇数索引值的元素:
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
。