alcance del constructor privado en Clase Anidada


Esto es más un rompecabezas que una pregunta. Tengo el siguiente código:

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

    }

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

Aquí la llamada para super(); en 1* se permite evento aunque el constructor de la clase base es private. Si escribimos las clases como clases separadas en el mismo paquete:

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

    }
}

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

El compilador da correctamente error en 2* ya que el constructor de la clase base no es visible.

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

Author: Anshu, 2012-09-22

3 answers

Si el miembro o constructor es declarado privado, entonces el acceso está permitido si y solo si ocurre dentro del cuerpo de la clase de nivel superior (§7.6) que incluye la declaración del miembro o constructor.

Http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

 28
Author: irreputable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-22 08:48:34

Porque las clases anidadas pueden verse entre sí miembros. Esto no tiene nada que ver con las declaraciones estáticas. Vea el siguiente ejemplo de su código con clases internas anidadas (no estáticas).

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

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

 4
Author: KappaMax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-22 08:47:31

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 not-private.

 1
Author: Frank Pavageau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-22 08:45:41