El acceso protegido de Java no funciona
-
22-07-2019 - |
Pregunta
En java, hay tres niveles de acceso:
- Público: abierto al mundo
- Privado: abierto solo a la clase
- Protegido: abierto solo a la clase y sus subclases (herencia).
Entonces, ¿por qué el compilador de Java permite que esto suceda?
TestBlah.java:
public class TestBlah {
public static void main(String[] args) {
Blah a = new Blah("Blah");
Bloo b = new Bloo("Bloo");
System.out.println(a.getMessage());
System.out.println(b.getMessage()); //Works
System.out.println(a.testing);
System.out.println(b.testing); //Works
}
}
Blah.java:
public class Blah {
protected String message;
public Blah(String msg) {
this.message = msg;
}
protected String getMessage(){
return(this.message);
}
}
Bloo.java:
public class Bloo extends Blah {
public Bloo(String testing) {
super(testing);
}
}
Solución
En realidad debería ser:
Abierto solo a las clases en el mismo paquete la clase y sus subclases (herencia)
Por eso
Otros consejos
Porque protegido significa subclase u otras clases en el mismo paquete.
Y en realidad hay un cuarto " predeterminado " nivel de acceso, cuando se omite el modificador, que proporciona acceso a otras clases en el mismo paquete.
Entonces protegido
está entre el acceso predeterminado y público
.
Para ser más específico, espera que protegido
funcione como lo hace en C ++.
Sin embargo, en Java, tiene un significado diferente. En Java, un método protegido está disponible para la clase (obviamente), todas las demás clases en el mismo paquete y cualquier subclase de esta clase. Las clases en otros paquetes no tendrán acceso a menos que subclasifiquen esta clase original.
Ver esta pregunta similar para obtener información más específica sobre marcadores de herencia.
Personalmente, casi nunca uso protegido
. Desarrollo aplicaciones en lugar de frameworks, por lo que es mucho más probable que defina métodos public
, private
y, con bastante frecuencia, marque toda mi clase como final .
En realidad, hay cuatro niveles de acceso: "público", "protegido", "privado". &erio; predeterminado también conocido como paquete privado o paquete protegido. El valor predeterminado limita la accesibilidad al paquete. El valor predeterminado es bastante útil y lo uso con frecuencia.
Puede llamar a b.getMessage ()
porque b
es de tipo Bloo
, que extiende Blah
y getMessage ()
está protegido. Protegido, como mencionó, permite que las subclases accedan al método.
Sin embargo, tiene los siguientes errores:
- Llamar a
super ()
sin argumentos en el constructorBloo
es un error. El compilador no puede encontrar el constructorBlah
sin parámetros porque definió uno con un parámetro String. - Llamar a
new Blah ()
enTestBlah
main
es un error por el mismo motivo que el anterior. - Hacer referencia a
a.testing
yb.testing
es un error porque no definió la variabletesting
para ninguna clase.