2011-04-19 5 views
5

Soru başlığımın durumumu açık bir şekilde anladığından emin değilim, öyleyse özür dilerim!() ParentClass bulunan korumalı bir yöntem erişmek içinİç sınıftaki bir yöntem, bir üst sınıf yöntemine erişebilir mi?

public class ChildClass extends ParentClass { 
    // more code 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
     public void anotherMethod() { 
      // insert code to access a method in ParentClass 
     } 
     }; 
    } 
} 

mümkün mü kodu için anotherMethod içinde: Neyse, ben şu kod parçacığını (görünürlük belirtildiği gibi) var diyelim? Eğer öyleyse, bu nasıl yapılabilir?

Ben böyle bir şey denedim

...

(ParentClass.this).parentMethod(); 

... ama belli ki o kapsam sorunları nedeniyle çalışmıyor.

+2

sadece yerine '(ParentClass.this) .parentMethod()' parentMethod() 'diyemezsiniz;' – Nishan

+0

'ParentClass bulunan korumalı bir yöntem' olabilir –

cevap

8

Bu ince derler:

class MyClass { 
} 

class ParentClass { 
    protected void parentMethod() { 
    } 
} 

class ChildClass extends ParentClass { 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
      public void anotherMethod() { 
       parentMethod(); // this works 
      } 
     }; 
    } 
} 
+0

+ 1 mirasından dolayı da çocukta bulundu: Bu sadece, ParentClass arayanla aynı pakette çalışıyorsa çalışacaktır. yani 'korumalı', çocuklara erişime ve yerel sınıfları paketlemesine izin verdiği için. –

+0

@Peter: hmm, emin misin? 3 sınıfın hepsini 3 farklı pakete koymaya çalıştım. Çalıştığımı düşünüyorum çünkü myMethod() 'daki“ Sınıfım ”aslında dış sınıfının“ Korumalı ”yöntemlerine erişimi olan bir iç sınıftır ve böylece“ ParentClass ”da uzar. – WhiteFang34

+0

@ WhiteFang34, Doğru. Test kodumu doğru şekilde derlemedim. –

6

olmayan bir statik iç sınıf Onu kendi yöntemleri sanki kapsayan sınıfın tüm yöntemlerini erişebilir:

public class Test { 
    public int getOne() { 
     return 1; 
    } 

    public class Inner { 
     public int getEnclosingOne() { 
      return getOne(); // this works... 
     } 
    } 
} 

Statik iç sınıfı olamaz, statik bir iç sınıf bir bağlı değil gibi ana sınıfın örneği. Bu yalnızca ek klasmanda statik yöntemleri çağırabilir.

Kalıtım hesaba katılırken kullanılan yöntemlerde, statik olmayan bir iç sınıftaki bir yöntem, kapsayıcı (dış) sınıfın tüm yöntemlerini kullanabilir.

İlgi çekici kısmı, olan Test2.super'dan getOne() işlevini elde eden Test2.super.getOne()'dır. Bu, Test2'nin yönteme erişeceği gibi, yani 'u kullanarak, dış sınıfın ad alanına eriştiğinizi belirtmek için Test2'u kullanır.

public class Test2 extends Test { 

    public int getInnerOuterParentOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterParentOne(); 
    } 
    public int getInnerOuterOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterOne(); 
    } 

    public int getOne() { 
     return 2; 
    } 

    public class Inner2 { 
     public int getOuterOne() { 
      return getOne(); 
     } 
     public int getOuterParentOne() { 
      return Test2.super.getOne(); 
     } 
    } 

    public static void main(String[] args) { 
     Test2 test2 = new Test2(); 
     System.out.println(test2.getInnerOuterOne()); // 2 
     System.out.println(test2.getInnerOuterParentOne()); // 1 
    } 
} 
1

irrelatively (alt sınıf en parentMethod() yılında super.parentMethod() hariç) görünürlüğe, Java "üst sınıf yöntemini" erişmek için hiçbir yolu yoktur.

kendisine, ChildClass geçersiz kılar parentMethod() eğer ChildClass diğer yöntemlerinden ParentClass.parentMethod() (atlayarak ChildClass.parentMethod()) aramak için hiçbir yolu yoktur. ChildClassparentMethod() geçersiz kılmaz eğer bir ChildClass 'ın yöntemi olarak erişebilmesi için

Ancak, bu yöntem, yani basitçe parentMethod() olarak, ChildClass tarafından miras alınır.