2009-01-21 16 views
6

Me doy cuenta de que esta es una pregunta muy básica, pero es una que siempre me ha molestado. Según entiendo, si declaras un campo privado en Java, entonces no es visible fuera de esa clase. Si está protegido, está disponible para clases heredadas y cualquier cosa en el mismo paquete (corrígeme si cualquiera de esas definiciones es incorrecta).Niveles de acceso de los miembros de la clase java

¿Esto significa que no es posible declarar un campo que solo es accesible para las clases heredadas y no para otras clases no heredadas en el mismo paquete?

Aprecio que hay formas de evitar esto, pero ¿hay casos en los que desearía tener este tipo de comportamiento?

Obviamente, la pregunta anterior se aplica tanto a los métodos como a los campos.

Muchas gracias.

+0

Solo un comentario sobre el vocabulario: de lo que estás hablando aquí es * accesibilidad * de variables (o visibilidad). El alcance de una variable es la parte del código donde se puede usar la variable (por ejemplo, el alcance de una variable local es el cuerpo del método o el bloque en el que está definido). –

+0

Muchas gracias por eso Luc – chillysapien

Respuesta

3

Básicamente:

  • privada: Accesible sólo por la clase.
  • public: Accesible por cualquier clase.
  • protected: Accesible por la clase, todas las clases heredadas y las clases del paquete actual (editado).
  • sin alcance definido: Accesible para todas las clases del paquete actual.

más información here.

+0

Protected tiene acceso al paquete, consulte las otras respuestas aquí, así como el enlace. – Eek

2

Sí, el acceso protegido de Java es un poco extraño de esa manera. No puedo ver de inmediato por qué es deseable en absoluto. Personalmente, no me molesta campos ya que no me gustan los campos no privados de todos modos (que no sean constantes), pero lo mismo es cierto para los demás miembros.

.NET no tiene el concepto de visibilidad de acceso de paquete/espacio de nombres, pero tiene una alternativa que es ensamblado (piense en "archivo jar" - no exactamente igual, pero cerrado). Francamente me gustaría tener espacio de nombres y opciones de visibilidad de unidad de despliegue, pero parece que estoy condenado a la decepción ...

+0

Podría estar en módulos JDK7 ... –

+0

Pero aún existe la cuestión del acceso a nivel de paquete a protegido ... así que sí, los módulos ayudarán, pero aún no es ideal :((También prefiero que "el anidado tiene acceso al exterior") "concepto de C# privado al revés en Java.) –

Cuestiones relacionadas