vuoi
o PayPal
tutte le volte che vuoi
MODIFICATORI D'ACCESSO E METODI GET E SET
Si ricorda intanto la necessità di mettere a inizio di ogni hiding
L'information è una pratica che consente
metodo un commento contenente le precondizioni e le di progettare un metodo che possa essere usato
postcondizioni. senza alcun bisogno di comprendere i dettagli del
**/ codice che lo implementa. Il termine enfatizza il
*PRE: descrive le condizioni che devono sussistere fatto che il programmatore agisce come se il
prima che il metodo sia invocato;
*POST: descrive gli effetti prodotti dall'invocazione corpo del metodo fosse nascosto.
del metodo; indica cosa varrà dopo che un metodo è
stato eseguito.
*/
MODIFICATORI D'ACCESSO PUBLIC E PRIVATE
public private
Le parole chiave e sono dette modificatori d'accesso o visibilità.
public
Come visto in precedenza, il modificatore indica che qualsiasi altra classe può usare
direttamente quella classe, metodo o variabile di istanza attraverso il suo nome.
Sebbene sia normale avere metodi e classi pubblici, non è
considerata buona abitudine quella di rendere pubbliche le variabili
tutte le variabili di istanza dovrebbero essere private!
di istanza:
private,
Quando una variabile di istanza è il suo nome non è accessibile al di fuori della definizione
della sua classe. La variabile può però essere usata all'interno di un o qualsiasi dei metodi definiti
nella sua stessa classe.
Es. public class SpeciePrimaProva {
private String nome;
public int popolazione;
public double tassoCrescita; //non più valida!
Allora: specieDelMese.nome= "...."
specieDelMese.popolazione=3750;
...
Quindi se sono tutte e tre private:
SpecieSecondaProva specieSegreta = new SpecieSecondaProva ();
specieSegreta.leggiInput(); //non più valida!
specieSegreta.nome = "..." //non più valida!
System.out.println (specieSegreta.popolazione); //non più valida!
System.out.println (specieSegreta.tassoCrescita);
Tuttavia, l'invocazione del metodo leggiInput è valida. Questo vuol dire che esiste ancora un modo per
assegnare un valore alle variabili di istanza di un oggetto.
Infatti all'interno della definizione del metodo leggiInput sono definite le istruzioni d'assegnamento
attraverso la classe scanner.
rendere privata una variabile non vuol dire che non se ne può modificare il valore.
Di conseguenza,
Significa invece che non è possibile utilizzare il nome della variabile di istanza per far riferimento
direttamente alla variabile al di fuori della classe.
N.B.: i modificatori d'accesso specificano in quali classi è possibile utilizzare una classe, una variabile di
istanza o un metodo. Se una variabile di istanza è privata, il suo nome non può essere usato epr accedere al
suo valore al di fuori della definizione della classe. Tuttavia può essere usato dai metodi definiti nella classe
di appartenenza. Se una variabile di istanza è pubblica, il suo nome può essere utilizzato ovunque senza
limiti.
METODI GET E SET
Rendere private tutte le variabili di istanza di una classe permette di avere un controllo totale su di esse. A
volte per accedere a tali variabili di istanza è necessario fornire dei metodi di accesso:
get:
Metodo è semplicemente un metodo che permette di osservare quali sono i dati contenuti in una
variabile di istanza. Per convenzione si chiamano getVariabileIst.
set:
Metodo di modifica o permettono di modificare i dati memorizzati nelle variabili di istanza
private. Per convenzione si chiamano setVaribileIstanza.
Definire metodi set e get sembrerebbe annullare lo scopo per cui le variabili sono date private; in realtà però
sono caratterizzati da controllo: per esempio il metodo set può infatti verificare se un cambiamento è
appropriato e notificare l'utente in caso di problemi.
Il this applicato alle variabili di istanza
Come visto all'inizio, in un blocco non dovrebbero coesistere due variabili che hanno lo stesso nome;
tuttavia, se una delle due è una variabile di istanza, ciò è possibile:
sia Persona una classe avente eta come variabile d'istanza;
public class Persona {
private int eta;
public void setEta (int eta){
eta=eta;
}
}
Il set funziona, perché assume che il primo eta sia la variabile d'istanza dell'oggetto di tipo Persona; esso
equivale a: public void setEta (int eta){
this.eta=eta;
}
Metodi dentro i metodi
Come visto in precedenza nel main, è possibile richiamare un metodo all'interno di un altro; si noti che se il
metodo invocato è nella stessa classe, l'invocazione viene effettuata senza scrivere il nome dell'oggetto.
Si consideri l'invocazione di un metodo rispondi all'interno di un altro metodo parla. Si noti che il metodo
rispondi non è preceduto dal nome oggetto e dal punto. Questo vuol dire che il metodo rispondi viene
chiamato sullo stesso oggetto che viene chiamato su parla.
incapsulamento
N.B. il termine viene usato spesso per descrivere le tecniche di programmazione moderne
che vogliono "nascondere" tutti i dettagli relativi a come un componente software opera fornendo al
programmatore che userà il componente solo le informazioni necessarie al suo corretto utilizzo.
I termini information hiding, ADT, incapsulamento riguardano tutti lo stesso concetto di base. L'idea è quella
di fare in modo che il programmatore che sfrutta la classe non debba preoccuparsi del modo in cui è stata
implementata. OGGETTI E RIFERIMENTI
Le variabili di tipo classe, come una variabile di tipo String, si comportano in maniera molto diversa rispetto
alle variabili di tipo primitivo. Infatti questi sono nomi di oggetti e gli oggetti sono i valori delle variabili di
tipo classe.
Le variabili di tipo classe forniscono un nome agli oggetti; ciascuna variabile, sia essa di tipo primitivo o di
tipo classe, è implementata come un'area di memoria:
• primitivo,
Se la variabile è di tipo il suo valore è immagazzinato nell'area di memoria destinata alla
variabile al momento della sua dichiarazione; necessita sempre di una stessa quantità di memoria.
• classe
Una variabile di tipo contiene invece l'indirizzo di memoria dell'oggetto a cui fa riferimento la
riferimento all'oggetto
variabile; è detta l'area di memoria in cui è memorizzato l'oggetto; possono
avere dimensione qualsiasi, vedesi un oggetto di tipo String.
Ciascun oggetto è memorizzato in qualche area di memoria del computer e ha un indirizzo. Dato che le
variabili di tipo classe memorizzano l'indirizzo di memoria degli oggetti e non gli oggetti stessi, l'istruzione
di assegnamento che vuole assegnare ad un oggetto gli stessi valori di un altro come segue:
specieTerrestre = specieKlingon;
finisce per dare due diversi nomi allo stesso indirizzo di memoria.
Operatori nelle classi
Come abbiamo già visto, dati due oggetti di una stessa classe, il simbolo = assegna al primo la stessa cella di
memoria del secondo, dando quindi a una stessa cella di memoria due nomi.
Alla stessa maniera, == controlla se due oggetti hanno lo stesso indirizzo.
Per verificare l'uguaglianza dei valori delle variabili d'istanza dei diversi oggetti, si dovrebbe definire un
metodo che, ad ogni variabile d'istanza del primo oggetto, confronta la stessa nel secondo oggetto.
Nel caso dei cani di cui all'inizio:
public boolean uguali (Cane a, Cane b){
return (a.nome == b.nome);
return (a.razza == b.razza);
return (a.eta==b.eta);
}
Altrimenti posso definire un metodo equals, che dato un oggetto, ritorna se un qualsiasi altro oggetto ha gli
stessi valori attribuiti alle variabili di istanza:
public boolean equals (Cane b){
return (this.nome.equalsIgnoreCase(b.nome));
return (this.razza.equalsIgnoreCase(b.razza));
return (this.eta==b.eta); N.B. con equalsIgnoreCase, confronto le stringhe
indipendentemente da maiuscole e minuscole
parametri formali di tipo classe:
N.B.: un parametro formale di tipo classe è una variabile locale che
contiene l'indirizzo di memoria di un oggetto del tipo classe specificato dal parametro. Quando viene
invocato il metodo il parametro viene inizializzato con l'indirizzo di memoria dell'argomento nell'invocazione
di metodo. ALCUNI APPROFONDIMENTI
1) COSTRUTTORI
Un costruttore è un particolare metodo invocato quando si utilizza l'operazione new per creare un nuovo
oggetto: Specie specieTerrestre = new Specie;
La variabile si riferisce a un oggetto di tipo specie creazione dell'oggetto
Nei costruttori visti fin ora, agli oggetti creati venivano forniti alle variabili d'istanza valori di default.
Ogni costruttore porta il nome della classe in cui nasce; inoltre, Java dispone di un costruttore di default che
inizializza i valori a "0" o "null" fintantoché non venga inizializzato un nuovo costruttore nella classe. Una
volta definito un costruttore, se si volesse usufruire di un costruttore di default sarebbe necessario ridefinirlo
(è sempre consigliabile avere in una classe un costruttore di default per qualsiasi esigenza futura).
Diversamente da un metodo set, un costruttore inizializza tutte le variabili d'istanza di un oggetto anche
qualora non venissero forniti i dati. Se il costruttore ottiene in imput solo i dati relativi ad un certo valore da
attribuire ad una sola variabile di istanza, non definendo quindi i valori delle altre, esso crea un oggetto e
inizializza a valori di default queste date variabili.
Es. riprendendo sempre la classe cane: //inizializza tutte le variabili
public Cane (String name, String specie, int anni){
this.nome=name;
this.eta = anni;
this.razza=tipo;
}
public Cane (String name){
this.nome=name;
//default
this.eta = 0; //default
this.razza= null;
} //costruttore di default
public Cane (){
this.nome=null;
this.eta = 0;
this.razza= null;
}
Quando si crea un oggetto utilizzando l'operatore new, occorre sempre includere l'invocazione a uno dei
metodi costruttori della classe; bisogna indicare la lista degli argomenti tra parentesi dopo il nome del
costruttore che, si ricorda, ha lo stesso nome della classe.
Ricordiamo che un'invocazione a un metodo costruttore assegna ad un oggetto un indirizzo di memoria; se io
scrivo: Cane mioAnimale = new Cane();
creo un oggetto di default. Una volta che l'oggetto è creato, non posso usare l'oggetto giù esistente per
set
posso modificarlo solo col
invocare un costruttore, ; perciò non vale:
mioAnimale.Cane("Balto", "Border Collie", 3);
N.B.: l'omissione del costruttore di default vuol dire che