2013-05-16 9 views
6

Recentemente, ho osservato un comportamento imprevisto di accesso ai campi priavte in Java. Si consideri il seguente esempio, che illustra il comportamento:Perché è consentito l'accesso a un campo privato di un altro oggetto?

public class A { 

    private int i; <-- private field! 

    public A(int i) { 
     this.i = i; 
    } 

    public void foo(A a) { 
     System.out.println(this.i); // 1. Accessing the own private field: good 
     System.out.println(a.i);  // 2. Accessing private field of another object! 
    } 

    public static void main(String[] args) { 
     (new A(5)).foo(new A(2)); 
    } 
} 

Perché mi è permesso di accedere al campo privato di un altro oggetto della classe A all'interno del foo metodo (2 ° caso)?

+0

Utilizzare la formattazione del codice per codice, input/output e documenti strutturati come HTML o XML. Per farlo, seleziona il campione e fai clic sul pulsante '{}' sopra il modulo di pubblicazione/modifica. –

risposta

13

I campi privati ​​proteggono una classe, non un'istanza. Lo scopo principale è consentire a una classe di essere implementata indipendentemente dalla sua API. Isolando le istanze tra loro o proteggendo il codice dell'istanza dal codice statico della stessa classe non porterebbe nulla.

+3

wiki della comunità? È questo scudo preventivo a prova di downvote? :) –

+0

@MarkoTopolnik No. In pratica ho anche osservato che le persone preferiscono fare un upvoting quando vedono l'immagine di un utente. Una risposta CW raccoglie meno upvotes e meno accettazioni (non posso dire con certezza per i downvotes). Se pensi che sia male, puoi aggiustarlo, però. –

+0

Si tratta di uno scudo positivo imho :) –

3

Questo perché sono della stessa classe. Questo è permesso in Java.

Avrete bisogno di questo accesso per molti scopi. Ad esempio, in una realizzazione di uguali:

public class A { 
    private int i; 

    @override public boolean equals(Object obj){ 
    if(obj instanceof A){ 
     A a = (A) obj; 
     return a.i == this.i; // Accessing the private field 
    }else{ 
     return false 
    } 
    } 
} 
+0

Non necessariamente _need_ it, ma rende un po 'meno prolisso per accedervi. – NilsH

+0

Sì, si può fare un 'obj.getI()' se è definito un accesso pubblico !!! – NINCOMPOOP

+0

@NoobUnChained: tutti i tuoi campi privati ​​hanno accesso pubblico? Qual è il punto di incapsulamento se è così? – Mohayemin

0

Il metodo foo appartiene alla stessa classe come fa la variabile i non c'è nessun danno nel consentire tale accesso.

Problemi correlati