2012-08-27 16 views
6

mam klasę i podklasęwewnętrzna klasa dostęp do zewnętrznej metody klasy, same nazwy metod

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

Ok, w wierszu 05 Id jak przejść test metoda klasy A. Ale mam iść do pętla, ponieważ nie wiem jak określić, aby użyć metody klasy A.

Jakieś pomysły?

+2

To nie jest podklasa. Jeśli naprawdę chcesz mieć tę strukturę, 'A.this.test()' zadziała. – Thilo

+0

@Thilo Masz rację, to jest wewnętrzna klasa. przepraszam 4, że –

Odpowiedz

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: jak @Thilo mnie ntioned: Unikaj używania tych samych nazw metod w klasie zewnętrznej i klasie wewnętrznej, dzięki temu unikniesz konfliktów nazw.

+3

+1. Prawdopodobnie lepszym rozwiązaniem byłoby po prostu zmienić nazwy metod tak, aby nie powodowały konfliktów. – Thilo

+0

Ogólnie rzecz biorąc masz rację, aby uniknąć tej samej nazwy metody, ale mój przypadek jest szablonem hibernacji Freemarker dla generarte-klas-delegatorów tylko z istniejących instancji. –

+0

Próbowałem tego na moim własnym kodzie i otrzymuję "niestatyczną zmienną, której nie można przywołać z kontekstu statycznego". A kiedy upuszczam A, to po prostu staje się this.test() (i ja coś z testu) dostaję "nie mogę znaleźć symbolu". Czy to dlatego, że mam wartość zwracaną, która powoduje błąd, a jeśli tak, to w jaki sposób zwracam wartość do funkcji wewnętrznej z funkcji zewnętrznej – NSaid

0

klasy B nie musi być tzw zagnieżdżone klasy rozszerzenia klasy A wystarczy napisać

public class B extends A { 
... 

} 

niż można wywołać za test() jak

super.test() 

Jeśli zadzwonisz test() jak to zrobić to, co nazywamy rekurencyjne i zamrozi aż do dnia Zmartwychwstania

0

Jeśli się to statyczne można nazwać

A.test() 

jeszcze trzeba instancję do wykorzystania w B

A a; 
a.test(); 
5

można zrobić coś takiego:

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

Następnie można uzyskać następujące dane wyjściowe:

Test from B 
Test from A 
Powiązane problemy