java - palabra - ¿Cómo es accesible esta variable privada?
private int java (5)
¿Cómo no se queja el compilador cuando escribo el siguiente código?
public class MyClass
{
private int count;
public MyClass(int x){
this.count=x;
}
public void testPrivate(MyClass o){
System.out.println(o.count);
}
}
Aunque es una instancia de la misma clase en la que se escribe
testPrivate
, ¿no debería dar un error de compilación en
System.out.println(o.count)
?
Después de todo, estoy tratando de acceder a una variable privada directamente.
El código incluso funciona bien.
Aunque es la instancia de la misma clase en la que se escribe testPrivate, pero no debería hacerlo a través de un error del compilador en System.out.println (o.count);
No Nunca arrojará un error de compilación.
Esto es muy similar a lo que hace un getter y setter simple o un constructor de copias.
Recuerde que podemos acceder a miembros
private
usando
this.
public MyClass {
private String propertyOne;
private String propertyTwo;
// cannot access otherObject private members directly
// so we use getters
// But MyClass private members are accessible using this.
public MyClass(OtherClass otherObject) {
this.propertyOne = otherObject.getPropertyOne();
this.propertyTwo = otherObject.calculatePropertyTwo();
}
public void setPropertyOne(String propertyOne) {
this.propertyOne = propertyOne;
}
public String getPropertyOne() {
return this.propertyOne;
}
}
Su método
testPrivate
acepta una instancia de MyClass.
Dado que
testPrivate
es un método dentro de
MyClass
, tendrá acceso a propiedades
private
.
public void testPrivate(MyClass o) {
this.propertyOne = o.propertOne;
}
Los métodos definidos dentro de la clase siempre tendrán acceso a sus miembros
private
, a través de
this.
e instancia variable.
Pero si define
testPrivate
fuera de
MyClass
, no tendrá acceso a miembros
private
.
Allí tendrá que usar un método o un setter o un getter.
¡Los accesos no son seguridad! Son encapsulados, para evitar que otros tengan que saber sobre el código.
Considere si alguien escribió un Quantum Bogo Sort , pero desapareció una vez que anuló el último error: comprender el código hace que uno se elimine del universo o se vuelva loco.
A pesar de este inconveniente menor, si se encapsula adecuadamente, este debería convertirse en su algoritmo de clasificación preferido, ya que todos los campos y métodos, excepto Ordenar, deberían ser privados.
No sabes cómo funciona, y no quieres saber cómo funciona, pero funciona y eso es suficiente. Si, por otro lado, todo es público, y tiene que comprender cómo hace lo que hace para usarlo correctamente, eso es demasiado molesto, me quedaré con la clasificación rápida.
Los campos privados son privados para la clase en su conjunto, no solo para el objeto.
Otras clases no saben que MyClass tiene un campo llamado recuento; sin embargo, un objeto MyClass sabe que otro objeto MyClass tiene el campo de recuento.
Se puede acceder a un miembro privado desde cualquier método dentro de la clase en la que se declara, independientemente de si ese método accede a su propio miembro privado (
this
) instancia o al miembro privado de alguna otra instancia.
Esto se afirma en JLS 6.6.1 :
... De lo contrario, si el miembro o el constructor se declara privado, entonces se permite el acceso si y solo ocurre dentro del cuerpo de la clase de nivel superior (§7.6) que encierra la declaración del miembro o constructor.
Esta característica de Java le permite escribir métodos que aceptan una instancia de la clase como argumento (por ejemplo,
clone(Object other)
,
compareTo(Object other)
) sin depender de que la clase tenga captadores no privados para todas las propiedades privadas que necesita ser accedido
Solo se puede acceder a los métodos, variables y constructores que se declaran privados dentro de la clase declarada. Consulta la documentación oficial