2011-03-15 21 views
9

Si escribo una clase abstracta, luego anido una clase en la clase abstracta, ¿tendré acceso a sus métodos en cualquier subclase de la clase abstracta? No puedo encontrar la respuesta en ningún lado.Clase abstracta con clase anidada, ¿es esto posible?

+0

Podría dar un ejemplo estructural? no estoy seguro de si quiere decir que la clase A es abstracta, la clase B es la clase interna de A (se extiende A? estática?) y la clase C se extiende A externa a A? o extiende B? Por favor sé un poco más específico. –

Respuesta

9

Por supuesto, los modificadores de acceso en las clases internas obedecen a las mismas reglas que en los campos y métodos. No importa si su clase es abstracta o concreta, siempre que la clase anidada sea public, protected o la subclase esté en el mismo paquete y la clase interna sea paquete privado (modificador de acceso predeterminado), la subclase tendrá acceso a eso.

public abstract class AbstractTest { 

    // all subclasses have access to these classes 
    public class PublicInner {} 
    protected class ProtectedInner {} 

    // subclasses in the same package have access to this class 
    class PackagePrivateInner {} 

    // subclasses do not have access to this class 
    private class PrivateClass {} 

} 
+0

Perfecto, excelente descripción. – providence

0

Si la clase anidada está al menos protegido, podemos acceder a sus métodos (siempre y cuando los métodos son públicos o que están en el mismo paquete y no son privadas).

Pero se podría haber intentado hacer esto usted mismo fácilmente :-)

1
class Abstract { 
    modifier1 class Nested { modifier2 int i = 0; } 
    Abstract() { 
     Nested n = new Nested(); 
     n.i = 1; 
    } 
} 

class Sub extends Abstract { 
    Sub() { 
     Nested n = new Nested(); 
     // have access as long you not choose "private" 
     // for `modifier1` or `modifier2`: 
     n.i = 5; 
    } 
}