19 Classi – Visibilità

Oggi vedremo due attributi molto importanti che possiamo assegnare sia a variabili, che a metodi e classi, public e private.

A cosa servono?
Con tali attributi possiamo decidere dove è visualizzabile una variabile, metodo o classe.
In generale:
public=>visibile da qualsiasi parte nel programma
private=>visibile sono all’interno della stessa classe
default=>se non mettiamo nessuno dei due precedenti è visibile all’interno dello stesso package. Nei primi programmi con i quali avrete a che fare di solito dovrete gestire solo un package quindi finché utilizzerete un solo package, default e public saranno praticamente dei sinonimi.

Vediamo ora nel dettaglio come si comportano gli attributi public e private (default come abbiamo detto è simile a public quindi lo tralascio) nei singoli casi: variabili, metodi e classi.

VARIABILI
public
Se le variabili (quelle dichiarate al di fuori dei metodi) all’interno di una classe X hanno questo attributo quando, in un altra classe Y, istanzieremo una variabile del tipo X potremo accedere in lettura e modificare la variabile pubblica con il l’istruzione variabileinY.variabileinX
private
Nelle stesse condizioni di public in questo caso non potremo accedere alla variabile con l’istruzione vista sopra. La variabile potrà comunque essere letta e modificata in maniera indiretta se esiste un metodo public che lo permette.

METODI
public
Il funzionamento è identico a quello delle variabili. Se un metodo possiede questo attributo potrà essere chiamato da un’altra classe con l’istruzione variabileinY.metododiX.
private
Al contrario con questo attributo il metodo non può essere chiamato al di fuori della classe stessa.

CLASSI
Delle classi non vi ho ancora detto una cosa: è possibile creare delle classi all’interno di altre classi creando “effetti matriosca”.
public
Questo attributo può essere assegnato a qualsiasi classe o sottoclasse e, come metodi e variabili, la rende visibile in qualunque punto del programma.
private
Possiamo usare private soltanto con le sottoclassi che saranno così visibili soltanto dalle classi che le contengono. Non avrebbe senso altrimenti creare una classe che non sia sottoclasse di nessuno e sia “private” perché non potrebbe interagire con il programma stesso.

Perchè rendere una classe/metodo/variabile pubblica o privata?
Se voi siete gli unici a scrivere un programma potreste mettere public ovunque perché tanto sapete quali metodi e variabili dovete usare e quali no di ciascuna classe che create, anche se sarebbe comunque meglio usare private laddove sapete che non dev’essere usato al di fuori della classe stessa, così anche se lo dimenticate non c’è problema.
Se invece il programma, come spesso capita nel mondo del lavoro, è scritto da un team, usare public e private non è opzionale ma obbligatorio. Questo perché di solito diverse persone si occupano di differenti classi, quindi ciascuno nella classe che crea deve decidere quali metodi/variabili/sottoclassi potranno essere viste e usate dalle altre classi per il corretto funzionamento del programma.

Concludiamo questo articolo che sta diventando un romanzo con un po’ di codice con qualche osservazione correlata.

public class ClasseNormale {
    public SottoClassePrivata cl1;
    public SottoClassePubblica cl2;
    private class SottoClassePrivata{
        public int a;
        private int b;
        public void ma(){
        }
        private void mb(){          
        }
    }
    public class SottoClassePubblica{
        public int c;
        private int d;
        public void mc(){           
        }
        private void md(){          
        }
    }
}

Osservazioni
• Entrambe le sottoclassi possono essere instanziate in ClasseNormale
• ClasseNormale attraverso le due variabili cl1 e cl2 può solo accedere ai due rispettivi metodi ma e mc, cioè ai metodi public.
• ClasseNormale attraverso le due variabili cl1 e cl2 può accedere in lettura e scrittura solo alle due variabili pubbliche di ciascuna SottoClasse, cioè ad a e c.
• Da un’altra classe, ad esempio dal main, delle due sottoclassi soltanto SottoClassePubblica è visibile anche se bisogna aggiungere “import main.ClasseNormale.SottoClassePubblica;” se si vuole istanziare una variabile del tipo SottoClassePubblica.

Chiudo qui l’articolo prima che vi addormentiate.
Come vi ho detto nel precedente articolo fate qualche esperimento, inviatemelo pure se non vi funziona qualcosa. Insomma scrivete se volete spiegato in maniera più chiara qualche argomento e non fate i timidi!
Vi saluto, alla prossima!

Please follow and like us: