2008-11-23 21 views
17

Así que yo estaba haciendo una clase el otro día y se utiliza el método de Eclipse para crear el método es igual cuando me di cuenta que genera el siguiente código trabajo:Visibilidad Java campo privado

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.

¿Qué está 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.

Respuesta

24

Se puede acceder desde diferentes instancias de la misma clase.

Según this page (el mío negrita):

A nivel miembro, también se puede utilizar el modificador público o sin modificador (paquete-privado) al igual que con clases de nivel superior, y con la misma sentido. 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 voy a reescribir esta línea:

if (t.privateInt == this.privateInt) 

podemos estar de acuerdo que "this.privateInt" se debe permitir: que está accediendo a ella desde dentro de la instancia de la clase de prueba que el mensaje "igual" ha sido enviado a.

Está menos claro que "t.privateInt" debería estar visible, porque t es una instancia separada de la clase 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 ver a los demás miembros privados.

+0

OK ... Ahora entiendo ... ¿POR QUÉ? ¿Por qué Java permitió que esto sucediera? ¿Puedes pensar en algunos ejemplos de la vida real? Entiendo por qué debería funcionar en iguales ... Pero debe haber un ejemplo mejor ... – pek

+0

Los únicos otros ejemplos serían similares a iguales donde se le da otra instancia de su clase como argumento. En cuanto a por qué Java lo hizo, es bastante estándar en los lenguajes OO: C++ funciona de la misma manera. Sobrecarga == en C++: http://artis.imag.fr/~Xavier.Decoret/resources/C++/operator==.html –

+0

¿Tan ... es una trivia bastante inútil? – pek

3

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

4

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

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

+0

O está confundiendo este campo con obj_of_same_class.field – Tom

+0

¿Podría elaborar un poco más o proporcionar un enlace que me ayude a comprender un poco más? – pek

+0

Traté de mejorar mi respuesta ... espero que ayude –

1

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.

0

La respuesta simple a esta confusión es recordar que los campos privados son visibles solo 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.

3

Una razón importante 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?

Cuestiones relacionadas