阅读“思考Java第4版”我在第14章中找到了这个例子:
public class CoffeeGenerator
implements Generator<Coffee>, Iterable<Coffee> {
private Class[] types = { Latte.class, Mocha.class,
Cappuccino.class, Americano.class, Breve.class, };
private static Random rand = new Random(47);
public CoffeeGenerator() {}
private int size = 0;
public CoffeeGenerator(int sz) { size = sz; }
public Coffee next() {
try {
return (Coffee)
types[rand.nextInt(types.length)].newInstance();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
class CoffeeIterator implements Iterator<Coffee> {
int count = size;
public boolean hasNext() { return count > 0; }
public Coffee next() {
count--;
return CoffeeGenerator.this.next();
}
public void remove() {
throw new UnsupportedOperationException();
}
};
public Iterator<Coffee> iterator() {
return new CoffeeIterator();
}
}
我注意到我从未面对过这种结构:
return CoffeeGenerator.this.next();
这是什么意思?我知道ClassName.class.Method(),但这是什么意思?
答案 0 :(得分:7)
CoffeeGenerator.this
允许从内部类CoffeeGenerator
CoffeeIterator
JLS 15.8.4将此描述为限定此
任何词汇封闭的实例(第8.1.3节)都可以通过明确限定关键字this来引用。
答案 1 :(得分:2)
班级CoffeeIterator
是CoffeeGenerator的内部班级,
CoffeeGenerator.this
是对外部班级this
的引用
内部类的对象有一个包装/外部对象,这是一种方式
引用包装/外部对象。
答案 2 :(得分:2)
CoffeeIterator
是内部类。这意味着每当创建CoffeeIterator
的新实例时,它必须与外部类CoffeeGenerator
的实例(对象)相关联。 CoffeeGenerator.this
只是意味着,它所属的外部类的对象的引用&#34;到。
相比之下,如果使用CoffeeIterator
关键字声明了static
,那么它将是一个嵌套类;它可以访问CoffeeGenerator
的静态成员和方法(甚至是私有成员),但它没有连接到CoffeeGenerator
的任何实例。在这种情况下,CoffeeGenerator.this
将是非法的。
答案 3 :(得分:0)
您需要CoffeeGenerator
来提供对当前对象的外部类this
的访问权限,next()
是对象的方法调用。