¿Por qué puede clonar establecer un campo privado en otro objeto?
-
13-09-2019 - |
Pregunta
Estoy aprendiendo Java, y el libro que estoy leyendo tiene el siguiente ejemplo de la clonación. En clone()
, mi primera instancia es capaz de establecer búfer en el nuevo objeto a pesar de buffer es private
. Parece que debería requerir el campo para ser protected
para que esto funcione.
¿Por qué se permite esto? No clone()
tener privilegios especiales que le permite acceder a los campos private
?
public class IntegerStack implements Cloneable {
private int[] buffer;
private int top;
// ... code omitted ...
@Override
public IntegerStack clone() {
try{
IntegerStack nObj = (IntegerStack) super.clone();
nObj.buffer = buffer.clone();
return nObj;
} catch (CloneNotSupportedException e)
{
throw new InternalError(e.toString());
}
}
}
Solución
El modificador private
no significa que sólo la misma instancia puede acceder al campo; significa sólo los objetos de la misma clase pueden acceder a ella.
El de Java Language Specification dice en < a href = "http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6" rel = "nofollow noreferrer"> §6.6, control de Acceso :
... si el miembro o constructor se declara privada, entonces se permite el acceso si y sólo si se produce dentro del cuerpo de la clase de nivel superior (§7.6) que encierra la declaración del miembro o constructor.
En otras palabras, cualquier cosa dentro de la clase puede acceder a él en cualquier momento. Incluso las clases anidadas pueden acceder los miembros private
y constructores en la clase envolvente, y viceversa.
(Usted no está solo en el malentendido que, echa un vistazo esta respuesta mucho-upvoted a "¿Cuál es su más larga celebrada supuesto de programación que resultó ser incorrecto? )