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());
        }
    }
}
¿Fue útil?

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? )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top