10.1小节只是讲如何创建一个类的内部类,因而只记录一下练习题。
练习题1:编写一个名为Outer的类,它包含一个名为Inner的类。在Outer中添加一个方法,它返回一个Inner类型的对象。在main()中,创建并初始化一个指向某个Inner对象的引用。
代码实现如下:
public class Outer {
Outer() {
System.out.println("I am Outer.");
}
class Inner {
Inner() {
System.out.println("I am Inner.");
}
}
public Inner getInner() {
return new Inner();
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.getInner();
}
}
10.2小节是讲内部类拥有其外围类的所有成员(字段和方法)的访问权。有意思的是,书中使用了"迭代器"模式来进行演示,如下代码:
迭代器接口:
interface Selector {
boolean end();
Object current();
void next();
}
容器类和容器类内部实现的迭代器:
public class Sequence {
private Object[] items;
private int next = 0;
public Sequence(int size) {
items = new Object[size];
}
public void add(Object o) {
if (next < items.length) {
items[next++] = o;
}
}
private class SequenceSelector implements Selector {
private int i = 0;
@Override
public boolean end() {
return i == items.length;
}
@Override
public Object current() {
return items[i];
}
@Override
public void next() {
if (i < items.length) {
i++;
}
}
}
public Selector getSelector() {
return new SequenceSelector();
}
}
练习题2:创建一个类,它持有一个String,并且有一个显示这个String的toString()方法。将你的新类的若干个对象添加到一个Sequence对象中,然后显示他们。
代码如下:
自定义新类Employee:
public class Employee {
private int id;
private String code;
public Employee(int id, String code) {
this.id = id;
this.code = code;
}
@Override
public String toString() {
return "Employee [id=" + id + ", code=" + code + "]";
}
}
在Sequence中创建该类对象,并输出:
public static void main(String[] args) {
Sequence sequence = new Sequence(10);
for (int i = 0; i < 10; i++) {
Employee emp = new Employee(i, "compony" + i);
sequence.add(emp);
}
Selector selector = sequence.getSelector();
while (!selector.end()) {
System.out.println(selector.current());
selector.next();
}
}
练习题3:修改练习题1,使得Outer类包含一个private String域(由构造器初始化),而Inner包含一个显示这个域的toString()方法。创建一个Inner类型的对象并显示它。
public class Outer2 {
private String val;
Outer2(String val) {
this.val = val;
}
class Inner {
Inner() {
}
@Override
public String toString() {
return "Inner [toString() Outer.val=" + val + "]";
}
}
public Inner getInner() {
return new Inner();
}
public static void main(String[] args) {
Outer2 outer = new Outer2("测试");
Outer2.Inner inner = outer.getInner();
System.out.println(inner);
}
}