Classi ed Oggetti in Java (Cenni)
Richiami Ruolo delle Classi in Java Oggetti
Ruolo delle classi in Java I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure stand-alone (metodi statici) oggetti (tramite variabili e metodi distanza, che definiscono il loro stato interno e le operazioni) Le due funzionalita possono coesistere allinterno di una stessa classe Una classe puo contenere variabili statiche e distanza Analogo per i metodi
Procedure Stand-alone Collezione di metodi statici (non ci sono variabili e metodi distanza) public class Num { public static int gcd (int n, int d) { while (n != d) if (n > d) n = n - d; else d = d - n; return n;} public static boolean isPrime (int p) { // implementazione} }
Oggetti Servono per creare nuovi tipi di dato con relative operazioni Vogliamo realizzare una classe BankAccount i cui oggetti sono dei semplici conti bancari. Vogliamo le seguenti operazioni depositare denaro prelevare denaro chiedere il saldo corrente
Come si procede? Variabili distanza devono modellare lo stato degli oggetti Metodi distanza devono modellare le operazioni richieste Costruttore (o costruttori) per creare un nuovo oggetto della classe
Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente // costruttori public BankAccount(double initial){ balance=initial; }
Una possibile implementazione // metodi public void deposit(double amount) { balance = balance + amount; } public void withdraw(double amount) { balance = balance - amount; } public double getBalance() { return balance; }
Variabili distanza Gli oggetti della classe si creano tramite new Le variabili distanza appartengono agli oggetti Ogni oggetto ha la propria variabile distanza balance BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000);
Come si accede? Dato che le variabili distanza appartengono agli oggetti vi si accede tramite il riferimento alloggetto (che puo anche essere implicito) Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) tramite il riferimento alloggetto BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}
ATTENZIONE: Specificatore di Accesso public (si puo accedere da qualsiasi metodo della classe o non ) private (si puo accedere solo da metodi della classe)
Esempio Supponiamo che balance sia private allora il seguente accesso dal metodo main non e legale (viene rilevato dal compilatore) BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); if (p1.balance=p2.balance) {…}
Ruolo di private Come vedremo e consigliabile sempre usare variabili distanza private Impediscono laccesso diretto allo stato degli oggetti che puo essere modificato solo dai suoi metodi distanza (tipo per esempio deposit e withdraw) Creano un incapsulamento degli oggetti (fondamentale per garantirne un corretto funzionamento)
Metodi distanza I metodi distanza eseguono operazioni su un determinato oggetto (che e riferito come this nel suo corpo) devono essere chiamati con il riferimento alloggetto (che puo anche essere implicito) per esempio da un metodo esterno alla classe come main BankAccount p1= new BankAccount(1000); BankAccount p2=new BankAccount(2000); p1.deposit(2000); p1.deposit(3000);
Specificatori di Accesso Valgono le stesse regole che per le variabili I metodi private possono essere chiamati solo dallinterno della classe Non fanno parte dellinterfaccia pubblica della classe (quindi delle operazioni che puo usare un utente del tipo di dato)
Metodi e Variabili Statici Variabili e metodi statici appartengono alla classe in cui sono dichiarati Sono quindi condivisi tra tutti gli oggetti della classe A differenza delle variabili e dei metodi di istanza che appartengono agli oggetti (istanze della classe). Come vedremo nella semantica stanno nellambiente delle classi e non nella heap
Esempio Supponiamo di volere modificare BankAccount in modo che ogni conto abbia un codice identificativo unico, diverso dagli altri Si puo utilizzare una variabile statica che mantiene il valore del primo numero intero fresh (non e ancora stato assegnato)
Una possibile implementazione public class BankAccount { public double balance; //il saldo corrente public int miapassword; //la password public static int password; //la prima password disponibile // costruttori public BankAccount(double initial){ balance=initial; miapassword=password; password++; } La variabile statica e unica e condivisa tra tutti i conti questo garantisce che il valore non sia stato gia usato.
Specificatori di accesso Valgono le stesse regole viste per le variabili ed i metodi di istanza
Variabili e Metodi Statici: come si accede? Supponiamo per esempio di essere in un metodo esterno alla classe (tipo main) e che la variabile sia public (anche se non ha senso da un punto di vista di sicurezza) Come facciamo a riferirci alla variabile password ?
Due Modi Possibili Tramite la classe di appartenenza BankAccount.password=1; Tramite un oggetto della classe BankAccount p1=new Bankaccount(1000); p1.password=1; La variabile statica e visibile da tutti gli oggetti della classe)
Regole di Visibilita dei Nomi Sono quelle verificate staticamente dal compilatore (si chiamano regole di scoping) Verifica che ogni accesso ad un nome (di variabile o metodo) sia legale, ovvero il legame tra le dichiarazioni e luso dei nomi
Regole di Visibililita dei Nomi Vediamo le regole di base Sono un po piu complicate di quelle che avete visto fino ad ora (erano semplificate a scopo didattico) Complicate dalla coesistenza di nomi statici e distanza Tralasciando i vincoli imposti dagli specificatori di accesso
Cosa e visibile da un oggetto? I suoi nomi distanza I nomi statici dichiarati nella classe a cui appartiene (perche sono condivise tra tutti gli oggetti)
Cosa e visibile da una classe? I suoi nomi statici Non sono visibili nomi distanza (sono relativi agli oggetti)
Metodi Come facciamo a capire se un accesso del seguente tipo e legale? Path.I Dipende dal Path e dal tipo di metodo (statico o distanza)
Path Vuoto Accesso diretto (I) Vediamo le variabili locali del metodo Vediamo quello che si vede dalla classe (se il metodo e statico) Vediamo quello che si vede dagli oggetti della classe (se il metodo e distanza o e un costruttore)
Esempio public void deposit(double amount) { balance = balance + amount;} public BankAccount(double initial){ balance=initial; miapassword=password; password++; } Accesso diretto alle variabili distanza (this implicito) e a quella statica Entrambe sono visibili dagli oggetti della classe
Path Classe Vediamo solo quello che si vede dalla classe Per esempio da main: BankAccount p1=new Bankaccount(1000); BankAccount.password=1; (accesso legale) BankAccount.balance=1; (accesso illegale)
Path Oggetto Vediamo quello che si vede dalloggetto Per esempio da main: BankAccount p1=newBankaccount(1000); p1.password=1;(accesso legale) p1.balance=1; (accesso legale)