java - una - Alcance del constructor privado en clase anidada.
como llamar una clase en netbeans (3)
Porque las clases anidadas pueden ver a los demás miembros. 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á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 clases anidadas aquí: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
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 el 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 error correctamente en 2 * ya que 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?
Porque todo lo declarado 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 privada.
si el miembro o el constructor se declara privado, entonces se permite el acceso 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