El modificador de acceso protected permite que los miembros de la clase sean visibles dentro del mismo paquete y en todas las subclases, incluso si están en otros paquetes.
Diferencias con otros modificadores:
private — acceso solo dentro de la clase actualprotected — accesible dentro del paquete actual y en los herederos fuera del paquetepublic — accesible en cualquier lugarEjemplo:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hello from parent"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // ¡Acceso permitido! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Error: no tiene acceso } }
¿Puede una clase externa (que no es un heredero) acceder al método
protecteddesde otro paquete, teniendo un objeto de esa clase?
Respuesta: No, el acceso al método protected desde otro paquete es permitido solo para las clases heredadas, y solo a través de this o mediante una referencia a un objeto heredero, no al padre.
Parent p = new Child(); p.sayHello(); // ¡Error! ((Child) p).sayHello(); // Éxito (si se llama desde dentro de Child)
Historia
En un gran proyecto modular, un desarrollador colocó métodos de negocio importantes en la sección
protected, pensando que eran inaccesibles fuera del paquete. Otros desarrolladores accidentalmente utilizaron esos métodos en pruebas en el mismo paquete, y debido a la posterior reubicación de las clases se produjeron errores de acceso inesperados.
Historia
En un proyecto de microservicios, intentaron llamar a un método con acceso protected usando una referencia del tipo padre en otro paquete — la llamada no funcionó. Esto provocó fallos en parte de los mecanismos de extensión del sistema, porque confiaban en una comprensión incorrecta del alcance.
Historia
En una biblioteca open-source, se usaron descuidadamente campos protected, que resultaron ser accesibles para un rango demasiado amplio de clases, lo que permitió accidentalmente dañar el estado interno del objeto, causando problemas en aplicaciones externas.