2011-07-08 136 views
1

比方說,我創建一個類的實例,並重寫它的方法在同一時間一個 - 這樣Java方法覆蓋 - 在父級訪問方法 - 這可能嗎?

MyClass fred = new MyClass() { 
    @Override 
    public void mymethod() { 
     super.mymethod(); 
     //call something here 
    } 
}; 

現在讓我們來想象一下我想調用它具有相同的名稱和(缺乏一個本地方法)參數作爲我重寫的方法 - 例如我有

public void mymethod() { 
    //my stuff in here 
} 

我該如何從重寫的方法中調用它(在行//這裏調用某些東西)???

這可能嗎?使用

this.mymethod(); 

導致無限循環(覆蓋方法是簡單地調用本身)

是否有訪問該方法的一種方式(除了通過靜態參考吧?)

抱歉,如果這是一個常見的問題 - 這是一個難以搜索的問題,我發現的一個問題沒有答覆,也沒有真正的措辭,所以我試圖自己!

+0

你能鏈接到其他相關的問題?也許我們也可以回答這個問題...... –

+0

我不是100%確定它是在StackOverflow上 - 瀏覽我的歷史記錄在這裏沒有顯示它,所以我懷疑它是在'克隆'網站上 - if我有機會再次穿過它,我會在這裏連接它 – shrewdlogarithm

回答

4

我沒有得心應手編譯所以我不是100%肯定在這裏,但試試這個:

ParentClass.this.myMethod(); 
+0

+1:巧妙的技巧,它的工作原理:http://ideone.com/bc6rJ –

+0

儘管如此,它並不是一個技巧,它是尋址封閉實例定義的一部分。如果'this'的實際類型是'T',則可以在調用實例方法時始終使用'T.this'作爲限定符。 –

+0

只有myMethod()是靜態的時候纔會有效嗎? – shrewdlogarithm

2

的醜陋,但功能的解決方案:

final MyOtherClass parent = this; 

MyClass fred = new MyClass() { 
    @Override 
    public void mymethod() { 
     super.mymethod(); 
     parent.mymethod(); 
    } 
}; 

我掙扎,看看你需要命名的目的做到這一點的情況下,但它是有用的知道,this在匿名類將參考匿名類,而不是「父」;所以如果你發現需要訪問父母的方法,這是一個有用的技術。

FWIW,這是working example

+0

啊 - 這是一個明顯的(我現在感覺有點berk)! 我意識到,理想情況下,我會使用不同的名稱 - 如果沒有其他原因,而不是幫助可讀性 - 但這可能會有用 - 謝謝! – shrewdlogarithm

+0

@John:對,這個確切的用例還不清楚,但我可以想象一種情況,即你陷入了無法控制的API中。 –

2

我不知道如果我完全理解這個問題,但我的猜測是,你要是這樣的:

public class ParentClass { 
    public void mymethod() { 
     .... 
    } 

    public void someOtherMethod() { 
     MyClass fred = new MyClass() { 
      @Override 
      public void mymethod() { 
       super.mymethod(); 
       //call something here 
       ParentClass.this.mymethod(); 
      } 
     } 
    } 
} 

ParentClass.this.mymethod()

+1

這是答案。 –

+0

它肯定是,但@Paul稍微擊敗@Charles追逐 - 謝謝壽! – shrewdlogarithm

+0

事實上,這不是我的答案,它是亞歷克斯吉特曼的,他擊敗了保羅,但保羅修改了他的答案。哈哈不斷髮展的互聯網,它重寫短期歷史! –