2011-04-19 15 views
5

No estoy seguro si el título de mi pregunta describe mi situación correctamente, así que mis disculpas si no lo hace. De todos modos, vamos a decir que tengo el siguiente fragmento de código (visibilidad es como se ha dicho):¿Puede un método en una clase interna acceder a un método de clase padre?

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

¿Es posible que el código dentro de anotherMethod() para acceder a un método protegido que se encuentra en ParentClass? Si es así, ¿cómo se puede hacer esto?

He intentado algo así como ...

(ParentClass.this).parentMethod(); 

... pero es obvio que no funciona debido a problemas de alcance.

+2

no puedes llaman 'parentMethod()' en lugar de '(ParentClass.this) .parentMethod();' – Nishan

+0

'un método protegido que se encuentra en ParentClass' puede ser encontrado en el niño también, debido a la herencia –

Respuesta

8

Este compila bien:

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: Esto solo funcionará si ParentClass está en el mismo paquete que la persona que llama. es decir, porque 'protected' permite el acceso a niños y el paquete de clases locales. –

+0

@Peter: hmm, ¿estás seguro? Intenté poner las 3 clases en 3 paquetes diferentes. Creo que funciona porque el 'MyClass' en' myMethod() 'es en realidad una clase interna que tiene acceso a los métodos' protected' de su clase externa 'ChildClass', y por lo tanto la' ParentClass' se extiende. – WhiteFang34

+0

@ WhiteFang34, estás en lo cierto. No compilé mi código de prueba correctamente. –

6

Una clase interna no estática puede acceder a todos los métodos de la clase envolvente como si fuera su propia métodos:

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

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

Una clase interna estática no puede, como una clase interna estática no está vinculada a una instancia de la clase padre. Eso solo puede llamar a métodos estáticos en la clase adjunta.

En cuanto a los métodos para tener en cuenta la herencia, un método en una clase interna no estática puede usar todos los métodos de la clase adjunta (externa).

La parte interesante es Test2.super.getOne() que de hecho obtiene getOne() de Test2.super, que es un Test. Esto es como si Test2 tuviera acceso al método, es decir, usando super aunque con el prefijo Test2 para indicar que está accediendo al espacio de nombres de la clase externa.

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

No hay manera de acceder a la "método de la clase padre" en Java, irrelatively a la visibilidad (a excepción de super.parentMethod() en la subclase de parentMethod()).

Es decir, si las anulaciones ChildClassparentMethod(), no hay manera de llamar ParentClass.parentMethod() (sin pasar por ChildClass.parentMethod()) de otros métodos de ChildClass.

Sin embargo, si ChildClass no altera temporalmente parentMethod(), ese método es heredado por ChildClass, para que pueda acceder a ella como método de una ChildClass 's, es decir, simplemente como parentMethod().

Cuestiones relacionadas