2010-04-21 12 views
7

Spero che questo codice spiega il problema:Come accedere a un metodo di superclasse da una classe annidata?

class Foo { 
    void a() {/*stuff */ } 
} 

class Bar extends Foo { 
    void a() { throw new Exception("This is not allowed for Bar"); } 

    class Baz { 
     void blah() { 
      // how to access Foo.a from here? 
     } 
    } 
} 

So che io possa fare qualcosa di sbagliato, perché l'eredità forse non deve essere usato in questo modo. Ma è il modo più semplice nella mia situazione. E, oltre a questo, sono solo curioso. È possibile?

risposta

16

Bar.super.a() sembra funzionare.

Per JLS section 15.12

NomeClasse. super NonWildTypeArguments_opt Identifier (ArgumentList_opt)

è una valida MethodInvocation

3

È possibile chiamare qualsiasi metodo dalla classe esterna con Outer.this.method().

Ma i metodi sono risolti in fase di esecuzione, quindi se è stato sostituito nella sottoclasse, solo il metodo sottoclasse (Bar.a()) può accedere all'originale (chiamando super.a()).

Come probabilmente hai scoperto, non è possibile scrivere Bar.this.super.a() - ma anche se fosse possibile, ti darebbe comunque Bar.a(), non .

Problemi correlati