2011-04-19 93 views
5

我不確定我的問題標題是否恰當地描述了我的情況,所以如果不是,我很抱歉!無論如何,讓我們說我有下面的代碼片段(如規定可見性):內部類中的方法是否可以訪問父類方法?

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

是否有可能在代碼中anotherMethod()來訪問父類中找到了一個受保護的方法是什麼?如果是這樣,這怎麼辦?

我試着像...

(ParentClass.this).parentMethod(); 

...但顯然它不會因爲範圍問題開展工作。

+2

你就不能調用'parentMethod()'代替'(ParentClass.this).parentMethod();' – Nishan 2011-04-19 10:12:13

+0

'父類中找到一個受保護的方法' 可在孩子身上發現,因爲繼承 – 2011-04-19 10:20:53

回答

8

編譯沒有問題:

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:這隻有在ParentClass與調用者位於同一個包中時纔有效。即因爲'protected'允許訪問兒童並打包本地課程。 – 2011-04-19 10:48:09

+0

@彼得:嗯,你確定嗎?我只是試着把3個班放在3個不同的包裏。我認爲這是有效的,因爲myMethod()中的MyClass實際上是一個內部類,它可以訪問外部類ChildClass的'protected'方法,因此可以擴展它的'ParentClass'。 – WhiteFang34 2011-04-19 11:00:49

+0

@ WhiteFang34,你是對的。我沒有正確編譯我的測試代碼。 – 2011-04-19 11:05:22

6

非靜態內部類可以訪問外部類的所有方法,好像它是它自己的方法:

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

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

靜態內部類不能像靜態內部類沒有被綁定到一個父類的實例。這隻能調用封閉類的靜態方法。

對於考慮繼承的方法,非靜態內部類中的方法可以使用封閉(外部)類的所有方法。

有趣的部分是Test2.super.getOne()確實從Test2.super獲得getOne(),這是Test。這就像Test2將訪問該方法一樣,即使用super,但前綴爲Test2,表示您正在訪問外部類的名稱空間。

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

沒有辦法訪問「父類的方法」在Java中,irrelatively到(在子類的parentMethod()除了super.parentMethod())的知名度。

也就是說,如果ChildClass覆蓋parentMethod(),有沒有辦法從的ChildClass其他方法調用ParentClass.parentMethod()(繞過ChildClass.parentMethod())。

但是,如果ChildClass不會覆蓋parentMethod(),該方法是通過繼承ChildClass,這樣您就可以訪問它作爲一個ChildClass的方法,即簡稱爲parentMethod()

相關問題