2012-03-30 2 views
2
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.h()?

ответ

3

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

(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(); 
4

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

+1

так A (2) здесь не имя нового класса, это родительский класс для не имя класса не перекрытый? исправьте меня – nabil

+0

A (2) означает, что этот новый анонимный класс создается с помощью аргумента конструктора 2 сразу. – jabal

2

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

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