Pregunta

Es el miembro privado de acceso a nivel de clase o en el nivel de objeto. Si es en el nivel de objeto, entonces el siguiente código no debe compilar

    class PrivateMember {
   private int i;
   public PrivateMember() {
      i = 2;
   }
   public void printI() {
      System.out.println("i is: "+i);
   }
   public void messWithI(PrivateMember t) {
      t.i *= 2;
   }
   public static void main (String args[]) {
      PrivateMember sub = new PrivateMember();
      PrivateMember obj = new PrivateMember();
      obj.printI();
      sub.messWithI(obj);
      obj.printI();
   }
}

Por favor, aclarar si el acceso a la miembro de i de obj dentro de la messWithI () de sub es válido

¿Fue útil?

Solución

Como DevSolar ha dicho, es a nivel de clase (nivel superior).

la sección 6.6 de la especificación del lenguaje Java :

  

De lo contrario, si el miembro o   constructor se declara privada, a continuación,   se permite el acceso si y sólo si   se produce dentro del cuerpo de la parte superior   clase de nivel (§7.6) que encierra el   declaración del miembro o   constructor.

Tenga en cuenta que no hay ninguna indicación de que está restringido a los miembros de un objeto en particular.

A partir de Java 7, el compilador ya no permite el acceso a miembros privados de variables de tipo . Así que si el método tenía una firma como public <T extends PrivateMember> void messWithI(T t) entonces sería un error del compilador para acceder t.i. Eso no cambiaría su situación particular, sin embargo.

Otros consejos

Tenga en cuenta que ni siquiera tiene acceso a nivel de la fuente que meterse con los campos privados. Mediante el uso de java.lang.reflect.AccessibleObject.setAccessibe(), todo el código puede acceder a todos los miembros privados de todos los otros códigos menos que especifique una política de seguridad que no lo permite.

private no es por sí mismo una función de seguridad! Es simplemente un fuerte indicio a otros desarrolladores que algo es un detalle de implementación interna que otras partes en el código no deben depender de.

Ni. Acceso privado está en el ámbito de la clase de nivel superior que encierra, por lo que puede acceder a miembros privados de una clase diferente de la misma clase de nivel superior:

class PrivateAccess {
    static class InnerOne {
        private int value;
    }

    static class InnerTwo {
        int getOne ( InnerOne other ) {
            return other.value;
        }
    }
}

El significado habitual de acceso de clase significa que usted tiene acceso a los soldados de otras instancias del mismo tipo. En Java, acceso privado está determinado léxico, no por tipo.

Nivel Clase. La idea es que el código de una clase (pero nada más) sabe cómo manejar objetos de esa clase.

Si usted tiene acceso al código fuente de la clase de todos modos, no tiene mucho sentido en "ocultar" nada de ti.

Como otros han dicho, el acceso privado predeterminado ( "Programa privado"), protegido y tal vez en el módulo de JDK 7 se basan clase (hay reglas muy extrañas para las clases anidadas herencia que puedo' t recordar). Pero ¿por qué?

Principalmente hay que bajar a los métodos que actúan como operadores binarios (o más). Para la implementación eficiente que a menudo requieren o son más fáciles de escribir sin tener que usar o modificar la API pública. Echar un vistazo a través de implementaciones de equals - en buen código que encontrará el acceso directo de los campos con pocas método llama a this. (El aspecto del funcionamiento de esto es irrelevante ahora en su mayoría con las JVM modernas inlining llamadas comunes, pero el tema de la calidad del código todavía está allí.)

Sólo para añadir a la respuesta de DevSolar, yo esperaría messWithI a ser declarado como tal estática:

public static void messWithI(PrivateMember t) {
  t.i *= 2;

} Tuve un tiempo difícil incluso la lectura de lo que sea que estuviera tratando de prescindir de la pista 'estático' ... y también hace que sea más fácil para responder a su pregunta original - que es que los miembros privados no están limitados en su alcance a poco la instancia en cuestión.

La misma página dice, en la subsección 6.6.8, también se puede encontrar la siguiente declaración:

  

Un miembro de la clase privada o el constructor es accesible sólo dentro del cuerpo de la clase de nivel superior que encierra la declaración del miembro o constructor. No se hereda por las subclases.

El miembro de la clase privada cuyo acceso se evalúa aquí es i .

messWithI public void () es un método que existe dentro del cuerpo de la clase de nivel superior, donde i ha sido declarado, que es, precisamente, PrivateMember .

Su construcción se encuentra con la declaración anterior, y es por eso que se ejecuta sin problemas.

Thas es otra forma de decir lo mismo que Jon y Devsolar.

Los modificadores de acceso para los miembros del grupo están relacionados con los que el código está escrito (en el que el paquete, y en el que la clase), independientemente de qué tipo de miembro del acceso se concederá:. Un miembro de la clase o un miembro de instancia

Como es lógico, no se puede utilizar un miembro de instancia de una clase si no tiene una instancia de la clase, pero eso es una cuestión diferente, relacionado con el ciclo de vida del miembro.

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