2012-09-22 17 views
22

Esto es más de un rompecabezas que la pregunta. Tengo el siguiente código:alcance del constructor privado en la clase jerarquizada

public class PrivateBaseConstructor { 
    public static class BaseClass { 
     private BaseClass() { 
     } 

    } 

    public static class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 
} 

Aquí el llamado a super(); a 1 * se encuentra habilitado el caso de que el constructor de la clase base es private. Si escribimos las clases como clases separadas en un mismo envase:

BClass.java 
public class BClass { 
    private BClass() { 

    } 
} 

DClass.java 
public class DClass extends BClass { 
    public DClass() { 
     super(); // 2* 
    } 

El compilador da razón de error al 2 * desde el constructor de la clase base no es visible.

¿Por qué el compilador no emite un error en mi primer escenario cuando ambas clases se declaran estáticas dentro de una clase?

Respuesta

1

Porque cualquier cosa declarada dentro de una clase puede acceder a sus miembros privados, incluidas las clases internas. Sin embargo, si ejecuta PMD en su clase, encontrará que sugiere que cambie la visibilidad del constructor a no privado.

4

Porque las clases anidadas pueden ver a los miembros de los demás. Esto no tiene nada que ver con las declaraciones estáticas. Vea el siguiente ejemplo de su código con solo clases internas anidadas (no estática).

public class PrivateBaseConstructor { 
    public class BaseClass { 
     private BaseClass() {} 
    } 

    public class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 

    public static void main(String[] args) 
    { 
     new PrivateBaseConstructor(). new DerivedClass(); 
    } 
} 

Leer más acerca de las clases anidadas aquí: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Cuestiones relacionadas