studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java language-features visibility

java - para - manual de programacion android pdf



Visibilidad de campo privado de Java (6)

Así que el otro día estaba haciendo una clase y usé el método de Eclipse para crear el método equals cuando me di cuenta de que generaba el siguiente código de trabajo :

class Test { private int privateInt; [...] public boolean equals(Object obj) { [...] Test t = (Test) obj; if ( t.privateInt == privateInt ) { [...] } }

t.privateInt .. ???? ¡Se supone que es privado! Así que supongo que hay una visibilidad de campo más que no sea privada, protegida, protegida de paquetes y pública.

Entonces, ¿Que esta pasando aquí? ¿Cómo se llama esto? ¿Dónde alguien usaría esto? ¿Esto no rompe la encapsulación? ¿Qué pasa si la clase no tiene un mutador y yo cambié esto? ¿Esto le sucede a C ++ también? ¿Es esto un modismo OO? Si no, ¿por qué Java lo hizo?

En general, ¿dónde puedo encontrar información sobre esto?

Gracias.


Mike es bastante correcto; está confundiendo objetos (instancias de una clase) con la clase misma. Los miembros son privados para la clase , no una instancia particular de la clase.

Recuerdo que me sorprendió tanto cuando era nuevo en Java.


Se puede acceder a las variables privadas de otra instancia de la misma clase. Esto se debe a que está tratando directamente con la implementación de la clase, lo que requiere que conozca sus variables internas, ''privadas'' de todos modos.


Usted hace referencia desde dentro de la misma clase. Por lo tanto, usted sabe lo que está haciendo y no necesita estar protegido de usted mismo.


Es accesible desde diferentes instancias de la misma clase.

De acuerdo con esta página (mina negrita):

En el nivel de miembro, también puede usar el modificador público o no modificador (paquete-privado) al igual que con las clases de nivel superior, y con el mismo significado. Para los miembros, hay dos modificadores de acceso adicionales: privado y protegido. El modificador privado especifica que solo se puede acceder al miembro en su propia clase.

Para mayor claridad, reescribiré esta línea:

if ( t.privateInt == this.privateInt )

Podemos aceptar que se debe permitir "this.privateInt": está accediendo desde dentro de la instancia de la clase Test que el mensaje "igual" se ha enviado a.

Está menos claro que "t.privateInt" debería ser visible, porque t es una instancia separada de Class Test y no estamos ejecutando dentro de su método equals. Sin embargo, java lo permite ya que ambos objetos (t y this) son de la misma clase Test y pueden verse miembros privados de los demás.


La respuesta simple a esta confusión es recordar que el campo privado solo es visible y solo en la clase donde se inicializan (y definen) ... Por lo tanto, cuando crea un objeto de la clase dentro de la clase, siempre puede acceder al campo privado de esa clase a través de la referencia del objeto. Puede ser que sientas que es difícil, pero solo piensa que el campo privado es como un campo público cuando lo estás usando dentro de la clase donde está definido.


Una gran razón para permitir el acceso a los miembros privados de otras instancias es permitir las funciones de "copia"; de lo contrario, serían prácticamente imposibles. Además, si no permitió el acceso a otras instancias, ¿qué permitiría para los métodos estáticos?