tipos - ¿Cuál es el modificador de acceso del constructor predeterminado en java?
que es un objeto en java (3)
Todos sabemos que si no definimos específicamente un constructor, el compilador inserta un constructor invisible de cero parámetros. Pensé que su modificador de acceso era público, pero al tratar con un problema de clase interna, encontré que tal vez estaba equivocado. Aquí está mi código:
public class Outer {
protected class ProtectedInner {
// adding a public constructor will solve the error in SubOuterInAnotherPackage class
//public ProtectedInner() {}
}
}
Y hay una subclase de Outer
en otro paquete:
public class SubOuterInAnotherPackage extends Outer {
public static void main(String[] args) {
SubOuterInAnotherPackage.ProtectedInner protectedInner
= new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can''t access the default constructor
}
}
Obtendrá un error en el método main()
, pero si agrega un constructor público a la clase ProtectedInner
, ese error se resuelve. ¡Es por eso que estoy pensando que el modificador del constructor predeterminado no es público! Entonces, ¿podría alguien decirme cuál es el modificador de acceso del constructor predeterminado?
Pensé que su modificador de acceso es público, pero cuando trato con un problema de clase interna, descubrí que tal vez estaba equivocado.
Sip. De hecho, me encontré en la misma situación hace un par de años. Me sorprendió un error (a través de la inyección de Guice, que lo hizo un poco más difícil de encontrar).
La clave es verificar la especificación, en este caso la sección 8.8.9 :
En un tipo de clase, si la clase se declara pública, entonces al constructor predeterminado se le otorga implícitamente el modificador de acceso público (§6.6); si la clase se declara protegida, entonces el constructor predeterminado recibe el modificador de acceso protegido (§6.6); si la clase se declara privada, al constructor predeterminado se le asigna implícitamente el modificador de acceso privado (§6.6); de lo contrario, el constructor predeterminado tiene el acceso predeterminado implícito por ningún modificador de acceso.
Entonces, en este caso, su constructor está protected
implícitamente.
Me gustaría señalar una cosa más que recibí recientemente. Si define un constructor predeterminado para su clase, entonces su especificador de acceso será lo que asigne. Por ejemplo,
public class A{
A(){
// do some stuff
}
}
Aquí el especificador de acceso del constructor predeterminado es el acceso al paquete y no el acceso público (el de la clase). sin embargo
public class A{
// no constructor is defined
}
Aquí el compilador simpatizará con usted y le dará un constructor predeterminado cuyo especificador de acceso será el mismo que la clase, que es público.
Además de lo que Jon dijo bastante bien, aquí hay un ejemplo de imagen, para los chicos visuales.
Si no hay un constructor en una clase, el compilador crea automáticamente un constructor predeterminado.
Aquí hay un ejemplo que describe con éxito la regla anterior:
Para mayor referencia, por favor consulte here .