2012-08-27 16 views
6

ho ottenuto una classe e una sottoclasseaccesso interno di classe per il metodo classe esterna, stessi nomi di metodo

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

Ok, in linea 05 id come accedere al test metodo della classe A. ma vado in un loop perché non so come specificare per utilizzare il metodo di classe A.

Qualche idea?

+2

Questa non è una sottoclasse. Se vuoi veramente avere questa struttura 'A.this.test()' funzionerebbe. – Thilo

+0

@Thilo Hai ragione, è una classe interiore. scusa 4 che –

risposta

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: come @Thilo me ntioned: Evita di usare gli stessi nomi di metodo nella classe esterna e nella classe interna, questo eviterà conflitti di denominazione.

+3

+1. Una soluzione probabilmente migliore sarebbe semplicemente cambiare i nomi dei metodi in modo che non entrino in conflitto. – Thilo

+0

In generale hai ragione di evitare lo stesso metodo, ma il mio caso è un modello di sospensione di Freemarker per generatori di classi generarte solo da istanze esistenti. –

+0

Ho provato questo sul mio codice e ottengo 'variabile non statica questo non può essere referenziato da un contesto statico'. E quando rilascio l'A in modo che diventi this.test() (e io qualcosa dal test) ottengo "Impossibile trovare il simbolo". È perché ho un valore di ritorno che causa l'errore e, in questo caso, come posso restituire un valore a una funzione interna da una funzione esterna – NSaid

0

Classe B non deve essere una cosiddetta classe annidata di estendere Classe A solo scrivere

public class B extends A { 
... 

} 

di quanto è possibile chiamare il test di A() come

super.test() 

Se si chiama test() come lo si fa è quello che noi chiamiamo ricorsivo e si blocca fino al Giorno del Giudizio

0

Se si rendono statico è possibile chiamare

A.test() 

ciò che serve un'istanza di A da utilizzare in B

A a; 
a.test(); 
5

Si può fare qualcosa di simile:

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

Hai quindi il seguente risultato:

Test from B 
Test from A 
Problemi correlati