вложенные классы анонимные классы - PullRequest
2 голосов
/ 30 марта 2012
public class A {
  protected int x;
  public A(int x) { this.x = x; }
  public void g() { System.out.println(x); }
  public void h() { System.out.println(x + 10); }
}
public class B {
  public void f() {
  (new A(2) {
    public void g() {
      h();
    }
   }).g();
  }
}

public static void main(String[] args) {
  new B().f();
}

Может ли какой-нибудь орган помочь мне понять эту строку в коде:

new A(2) { public void g() {h();} }).g();

Я не понимаю, определяет ли он здесь анонимный класс с помощью A ??а как в анониме он может ссылаться на Ах ()?

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

В этой строке создается безымянный класс, который переопределяет метод g() родительского класса, так что он выполняет новую функцию: вызывает h().Однако он сразу вызывает метод g() для этого безымянного класса.

3 голосов
/ 30 марта 2012

Он создает анонимный класс, а также перезаписывает g().Это то же самое, что когда вы используете Runnable и override run.

(new A(2) { public void g() {h();} }).g();

означает

class C extends A
{
    public C()
    {
        super(2);
    }

    @Override
    public void g()
    {
        this.h();
    }
}

(new C()).g();  // or C c = new C(); c.g();
2 голосов
/ 30 марта 2012

Строка, которую вы цитировали, определяет новый анонимный класс, который extends A и Overrides g(), а затем вызывает его.

Поскольку анонимный класс расширяет A, он воплощает определение h(), поэтому его можно вызывать

...