在Java第4版中思考 - 什么是classname.this.method()

时间:2014-03-24 21:19:57

标签: java

阅读“思考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(),但这是什么意思?

4 个答案:

答案 0 :(得分:7)

CoffeeGenerator.this允许从内部类CoffeeGenerator

访问外部类CoffeeIterator

JLS 15.8.4将此描述为限定此

  

任何词汇封闭的实例(第8.1.3节)都可以通过明确限定关键字this来引用。

阅读:Inner classes

答案 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()是对象的方法调用。