2012-08-27 19 views
6
i 05 id A sınıfı yöntemi testini erişmek ister hattında bir sınıf ve bir alt

iç sınıf erişimi, aynı yöntem adları

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

Tamam, var

Ama bir girmeyeceğim döngü çünkü sınıf A'nın yöntemini kullanmak için nasıl belirteceğimi bilmiyorum.

Herhangi bir fikir?

+2

Bu bir alt sınıf değil. Eğer gerçekten bu yapıya sahip olmak istiyorsanız '.This.test() 'çalışırdı. – Thilo

+0

@Thilo Haklısınız, onun bir iç sınıfı. Üzgünüm, bu –

cevap

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 } 

DÜZENLEME kadar donacak budur: Benim @Thilo gibi ntioned: Dış sınıf ve iç sınıftaki aynı metod isimlerini kullanmaktan kaçının, bu isimlendirme çakışmalarını önleyecektir.

+3

+1. Muhtemelen daha iyi bir çözüm, yöntem isimlerini çatışmamak için değiştirmektir. – Thilo

+0

Genel olarak, aynı yöntem adını kullanmaktan kaçınmaya hakkınız var, fakat benim durumum, yalnızca varolan örneklerden generarte delegator sınıfları için bir Freemarker Hazırda Bekletme Şablonudur. –

+0

Bunu kendi kodumda denedim ve 'statik olmayan bir değişkene bu statik bir bağlamdan başvurulamıyor' alıyorum. Ve A'yı düşürdüğümde, sadece bu .test() olur (ve testten bir şey alırım). 'Sembolü bulamıyorum'. Hataya neden olan bir dönüş değeri var ve eğer öyleyse o zaman bir dış fonksiyondan bir içsel fonksiyona nasıl bir değer döndürüyorum? – NSaid

0

Sınıf B ararsanız

super.test() 

gibi A'nın testi() çağırabilir göre sadece

public class B extends A { 
... 

} 

yazma Sınıf A uzatmak için iç içe sınıf adlandırılanın olmak zorunda değildir bunu yapmak gibi testi() biz özyinelemeli arayıp kıyamete

0

bunu statik sen

A a; 
a.test(); 
5

Böyle bir şey yapabilirsiniz B'de kullanmak A'nın bir örneğini ihtiyaç Else

A.test() 

çağırabilir yaparsanız:

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

Daha sonra aşağıdaki çıktıya sahip olursunuz:

Test from B 
Test from A