2012-03-30 4 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(); 
} 

Peut un corps me aider à comprendre cette ligne dans le code:classes imbriquées les classes anonymes

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

Je ne comprends pas s'il définit une classe anonyme ici avec A ?? et comment dans l'anonyme il peut se référer à A.h()?

Répondre

3

Il crée une classe anonyme et aussi g() remplace. C'est la même chose lorsque vous utilisez Runnable et override exécuter.

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

signifie

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

Cette ligne crée une classe non nommée qui remplace la méthode g() de la classe parente afin qu'elle fasse une nouvelle chose: l'appel de h(). Cependant, il appelle immédiatement la méthode g() sur cette classe non nommée à la fois.

+1

donc (2) n'est pas ici le nom de la nouvelle classe, il est une classe parente pour la classe non nom ne suppression d'un? corrigez-moi s'il vous plaît – nabil

+0

Un (2) signifie que cette nouvelle classe anonyme est instanciée avec l'argument constructeur 2 à la fois. – jabal

2

La ligne que vous avez indiquée définit une nouvelle classe anonyme extends A et Overridesg(), puis l'invoque.

Depuis la classe anonyme extends A, il incarne la définition de h() peut donc être invoqué

Questions connexes