2012-08-27 12 views
6

tengo una clase y una subclaseacceso clase interna al método de la clase externa, mismos nombres de los métodos

01 public class A{ 
02 void test(){}; 
03 public class B{ 
04  void test(){ 
05  test(); 
06  } 
07 } 
08 } 

Ok, en la línea 05 identificación como para acceder al método de ensayo de la clase A. Pero voy a una ciclo porque no sé cómo especificar para usar el método de la clase A.

¿Alguna idea?

+2

Eso no es una subclase. Si realmente quieres tener esta estructura, 'A.this.test() 'funcionaría. – Thilo

+0

@Thilo Tienes razón, es una clase interna. lo siento 4 que –

Respuesta

13
01 public class A{ 
02 void test(){}; 
03 public class B{ 
04  void test(){ 
05  test(); // local B.test() method, so recursion, use A.this.test(); 
06  } 
07 } 
08 } 

EDIT: como me @Thilo ntioned: Evite utilizar los mismos nombres de método en la clase externa y en la clase interna, esto evitará conflictos de nombres.

+3

+1. Una solución probablemente mejor sería cambiar los nombres de los métodos para que no entren en conflicto. – Thilo

+0

En general, tiene razón al evitar el mismo nombre de método, pero mi caso es una plantilla de Hibernate de Freemarker para generar clases de delegados de instancias existentes solamente. –

+0

He intentado esto con mi propio código y obtengo 'variable no estática a la que no se puede hacer referencia desde un contexto estático'. Y cuando dejo caer A para que se convierta en this.test() (y algo de prueba) obtengo 'can not find symbol'. ¿Es porque tengo un valor de retorno que causa el error? Si es así, ¿cómo devuelvo un valor a una función interna desde una función externa? – NSaid

0

Clase B no tiene que ser una llamada clase anidada para extender la clase A se limite a escribir

public class B extends A { 
... 

} 

de lo que puede llamar a la prueba de A() como

super.test() 

Si llama test() como lo hace eso es lo que llamamos recursiva y se congela hasta el Día del Juicio

0

Si usted lo hace estática puede llamar

A.test() 

más necesita una instancia de A a utilizar en B

A a; 
a.test(); 
5

Puede hacer algo así:

public class A{ 
    void test(){ 
     System.out.println("Test from A"); 
    }; 
    public class B{ 
     void test(){ 
      System.out.println("Test from B"); 
      A.this.test(); 
     } 
    } 

    public static void main(String[] args) { 
      A a = new A(); 
      B b = a.new B(); 
      b.test(); 
    } 
} 

Tiene la siguiente salida:

Test from B 
Test from A 
Cuestiones relacionadas