Originariamente inviato da Alex'87
Attributi
private/protected SEMPRE, a meno che non siano delle costanti utilizzabili da altri

Metodi
private/protected i metodi interni, che non devono essere utilizzati direttamente
public per i metodi "operativi", quelli che chi usa la tua classe deve utilizzare

Ad esempio, pensa ad una classe che fornisce un metodo per il quick sort. Per funzionare ha bisogno di (almeno) tre parametri: l'array da ordinare e due indici che indicano l'inizio e la fine della partizione in considerazione.
Potresti avere questo metodo:
codice:
public static void quicksort(int[] array, int start, int end) { ... }
Chi lo usa però deve dare troppe informazioni: lui ha l'array da ordinare, non si deve porre il problema di passare anche la partizione... Se passa dei valori sbagliati (negativi, superiori alla dimensione dell'array)?

In un caso così puoi sfruttare private per fare due versioni del metodo: una pubblica, "semplice", e una privata che fa il lavoro sporco. Esempio:

codice:
public class ArrayUtils {
    private static void quicksort(int[] array, int start, int end) { 
        ...
    }

    public static void quicksort(int[] array) {
        quicksort(array, 0, array.length);
    }
}
Il programmatore che userà la classe ArrayUtils vedrà solo il metodo pubblico, dell'altro non gliene importerà nulla, è come se per lui non esistesse.

Quello che farà sarà solo
codice:
int[] array = {21, 4, 12, 100, 43, ... ecc};
ArrayUtils.quicksort(array);
Fine, senza preoccuparsi di partizioni ecc.
ok grazie per l'esempio che mi hai dato... Per concludere diciamo quindi che il modificatore private applicato a metodi o variabili permette di nascondere alle altre classi questi metodi o variabili per motivi diversi. Nel senso che applicato a una variabile ti da la padronanza di gestione su di essa, dando cosi la possibilità di non porterle modificare, ad altri, con qualsiasi valore oltre al fatto permettendo anche di effettuare dei controlli su di essa prima della valorizzazione.

Per i metodi invece ti crei metodi il cui scopo è quello di effettuare una determinata azione senza che il programmatore che utilizza quella classe sappia che è stata fatta.

Correggimi se ho detto delle cavolate....

Comunque mille grazie per l'aiuto.