Classi. Progetto di classi: Dalla specifica dellinterfaccia, alla definizione dellimplementazione Metodi Costruttori Documentazione e commenti Variabili.

Slides:



Advertisements
Presentazioni simili
Dipartimento di Ingegneria Idraulica e Ambientale - Universita di Pavia 1 Caduta non guidata di un corpo rettangolare in un serbatoio Velocità e rotazione.
Advertisements

TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
Classi ed Oggetti in JAVA
1 Pregnana Milanese Assessorato alle Risorse Economiche Bilancio Preventivo P R O P O S T A.
Oggetti Java.
Costruttori e Distruttori
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Frontespizio Economia Monetaria Anno Accademico
Fondamenti di Informatica
Interfacce. Interfacce come strumento di progetto Scelta delle classi di un progetto Criteri di coesione e accoppiamento Interfacce e riuso di codice.
JAVASCRIPT DIFFERENZA TRA JAVASCRIPT E JAVA TAG LO SCRIPT OGGETTI LE CLASSI FUNZIONE GESTORE DI EVENTI ELEMENTI DEL LINGUAGGI è un vero e proprio linguaggio.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Programmazione 1 9CFU – TANTE ore
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
eliana minicozzi linguaggi1a.a lezione2
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Soluzione Esercizio - Classe Vettore
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Programmazione Corso di laurea in Informatica
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Approfondimento delle classi
JavaScript: Array JavaScript: Array.
Ereditarietà. Concetti principali Ereditarietà e (overriding) di metodi Dynamic dispatch e polimorfismo Ereditarietà e costruttori Livelli di accesso.
Progetto di applicazioni grafiche. Disegno di forme complesse Prassi : un classe per ciascuna forma Progetta la forma individuando le componenti base.
Programmazione con Interfacce
Capitolo 3 Realizzare classi
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Le variabili in Java Nella programmazione tradizionale, una variabile è una porzione di memoria in cui è immagazzinato un certo tipo di dato. Per esempio.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 11 e 12 -
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Programmazione ad oggetti
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
1 Lezione IX Lu 10-Ott Convertire numeri in stringhe  Si puo’ usare l’operatore di concatenazione; funziona anche con i numeri:  In alternativa.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Programmazione in Java
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Transcript della presentazione:

Classi

Progetto di classi: Dalla specifica dellinterfaccia, alla definizione dellimplementazione Metodi Costruttori Documentazione e commenti Variabili di istanza (campi)

Progetto di una classe Un conto bancario ( BankAccount ) Individuiamo il comportamento del conto Metodi deposita un importo preleva un importo richiedi il saldo

Metodi Metodi della classe BankAccount : Vogliamo fornire supporto per chiamate di metodo quali: harrysChecking.deposita(2000); harrysChecking.preleva(500); System.out.println(harrysChecking.saldo()); deposita() preleva() saldo()

Metodi Specifica: livello di accesso ( public ) tipo del risultato ( String, …, void ) nome del metodo ( deposita ) lista di parametri per ciascun metodo ( double importo ) Continua…

Sintassi: definizione di metodi accessSpecifier returnType methodName(parType parName,...) { corpo del metodo } Esempio: public void deposita(double importo) {... }

Metodi per BankAccount public void deposita(double importo) {... } public void preleva(double importo) {... } public double saldo() {... }

Costruttore Un costruttore inizializza i campi delloggetto creato Nome del costruttore = nome della classe public BankAccount() { // corpo... } Continua…

Costruttore Il corpo del costruttore eseguito quando loggetto viene creato con new definisce la struttura delloggetto creato Una classe può avere più costruttori, tutti con lo stesso nome (il nome della classe) purché tutte abbiano parametri diversi Il compilatore distingue le diverse definizioni basandosi sul tipo degli argomenti

Sintassi: definizione del costruttore accessSpecifier ClassName(parameterType parameterName,...) { corpo del costruttore } Esempio: public BankAccount(double saldoIniziale) {... }

BankAccount: Interfaccia pubblica I costruttori ed i metodi public di una classe formano linterfaccia pubblica della classe class BankAccount { // Costruttori public BankAccount() { // corpo da definire } public BankAccount(double initialsaldo) { // corpo da definire } // Metodi public void deposita(double importo) Continua…

BankAccount: Interfaccia pubblica { // corpo da definire } public void preleva(double importo) { // corpo da definire } public double saldo() { // corpo da definite } // campi privati / rappresentazione da definire }

Sintassi: definizione di classe accessSpecifier class ClassName { costruttori metodi campi(rappresentazione) } Esempio: public class BankAccount { public BankAccount(double saldoIniziale) {... } public void deposita(double importo) {... }... } A volte introdurremo i campi come prima cosa

Domanda Come possiamo utilizzare il metodi dellintefaccia pubblica per azzerare il saldo del conto harrysChecking ?

Risposta harrysChecking.preleva(harrysChecking.saldo())

Documentazione /** Un conto bancario ha un saldo che può essere modificato mediante depositai e prelievi. */ class BankAccount {... } Fornire documentazione per Tutte le classi Tutti i metodi Tutti i parametri Tutti i valori restituiti

Documentazione dellinterfaccia /** Preleva dal importo - limporto da prelevare */ public void preleva(double importo) { // definizione in seguito } /** Restituisce il saldo corrente del il saldo */ public double saldo() { // definizione in seguito }

Javadoc

Campi Gli oggetti memorizzano il proprio stato ed i propri dati nei campi La definizione di classe introduce i campi, dichiarandoli class BankAccount {... private double saldo; }

Campi La dichiarazione di un campo include: Specifica dei diritti di accesso ( private ) Tipo della variabile ( double ) Nome della variabile ( saldo ) Ciascun oggetto di una classe ha una copia distinta dei propri campi

Campi

Sintassi: dichiarazione di campi class ClassName {... accessSpecifier fieldType fieldName;... } Esempio: class BankAccount {... private double saldo;... }

Accesso ai campi I campi non sono parte dellinterfaccia private quindi visibili solo ai metodi della classe, non al codice esterno alla classe Il metodo deposita() di BankAccount può accedere al campo saldo : Continua… public void deposita(double importo) { double nuovoSaldo= saldo + importo; saldo= nuovoSaldo; }

Accesso ai campi Metodi di altre classi, allinverso, non possono accedere ai campi di BankAccount class Ladro { public static void main(String[] args) { BankAccount momsSavings = new BankAccount(1000);... momsSavings.saldo = -1000; // COMPILER ERROR! } }

Accesso ai campi Encapsulation raggruppare i dati e le operazioni in classi non è sufficiente a garantire leffetto black box per le istanze Necessaria lassistenza del compilatore Garantisce hiding di dati Per ogni classe esporta linterfaccia pubblica (il contratto tra la classe e i clienti) e maschera limplementazione privata che manipola lo stato delloggetto In questo modo i i clienti dipendono solo dal contratto, e possiamo re-implementare i metodi senza dover modificare i clienti (codice mantenibile)

Implementazione di costruttori I costruttori definiscono codice per inizializzare i campi public BankAccount() { saldo = 0; } public BankAccount(double saldoIniziale) { saldo = saldoIniziale; }

Chiamata di un costruttore Crea un nuovo oggetto di tipo BankAccount Chiama il secondo costruttore (visto che la chiamata fornisce un parametro) Inizializza il campo saldo delloggetto appena creato al valore 1000 Restituisce un riferimento alloggetto appena creato come risultato della valutazione dellespressione new Memorizza il riferimento nella variabile harrysChecking BankAccount harrysChecking = new BankAccount(1000);

Implementazione di metodi Un metodo che non restituisce valori Un metodo che restituisce un valore Nulla di strano public void preleva(double importo) { double newsaldo = saldo - importo; saldo = newsaldo; } public double saldo() { return saldo; }

File BankAccount.java 01: /** 02: Un conto bancario ha un saldo che può essere 03: modificato mediante depositai e prelievi. 04: */ 05: public class BankAccount 06: { 07: /** 08: Costruisce un conto bancario con saldo zero 09: */ 10: public BankAccount() 11: { 12: saldo = 0; 13: } 14: 15: /** 16: Costruisce un conto con un dato saldo iniziale. initialsaldo il saldo iniziale 18: */ Continua…

File BankAccount.java 19: public BankAccount(double initialsaldo) 20: { 21: saldo = initialsaldo; 22: } 23: 24: /** 25: deposita un importo sul conto. importo limporto da depositaare 27: */ 28: public void deposita(double importo) 29: { 30: double newsaldo = saldo + importo; 31: saldo = newsaldo; 32: } 33: 34: /** 35: Preleva un importo dal conto. importo limporto da prelevare Continua…

File BankAccount.java 37: */ 38: public void preleva(double importo) 39: { 40: double newsaldo = saldo - importo; 41: saldo = newsaldo; 42: } 43: 44: /** 45: Restituisce il saldo corrente. saldo corrente 47: */ 48: public double saldo() 49: { 50: return saldo; 51: } 52: // rappresentazione 53: private double saldo; 54: }

Domanda Come modifichereste la definizione della classe BankAccount.java per associare a ciascun conto un numero?

Risposte Aggiungendo un nuovo campo e definendo come segue limplementazione del costruttore e del metodo di accesso private int accountNumber; public BankAccount(double initsaldo, int number) { saldo = initsaldo; accountNumber = number; } public int getAccountNumber() { return accountNumber; };

Tombola! Vediamo limplementazione delle classi che dellapplicazione che simula una tombola Utilizziamo due classi di libreria Random TreeSet Definiamo le due classi Banco Giocatore

Random Costruttore: Random(long seed) crea un generatore a partire da seed Metodi: public int nextInt(int n) restituisce un numero psudocasuale nellintervallo [0..n-1] ottenuto dalla sequenza di numeri casuali associati al generatore

TreeSet Costruttore: TreeSet crea un insieme vuoto Metodi: boolean add(T e) aggiunge e ; true se e non apparteneva allinsieme boolean remove(T e) rimuove e ; true se e apparteneva allinsieme T[] toArray() restituisce un array con gli elementi dellinsieme

Banco Costruttore: Banco() crea una nuova istanza della classe Metodi: int estraiNumero() restituisce un numero nellintervallo [1..90] (ad ogni chiamata genera un numero diverso)

Banco public class Banco { private Random generatore; private TreeSet numeriUsciti; private int MAXNUM = 90; public Banco() { generatore = new Random(System.currentTimeMillis()/101); numeriUsciti = new TreeSet (); } // … continua

Banco public int estraiNumero() { boolean isNew = false; int num = 0; do { num = generatore.nextInt(MAXNUM) + 1; isNew = numeriUsciti.add(num); } while (!isNew); return num; } } // chiude la definizione della classe Banco

Giocatore Costruttore Giocatore(String nome) crea un giocatore, con il nome indicato e una scheda Metodi: void controllaNumero(int) se x è contenuto nella scheda lo marca boolean tombola() true quando tutti i numeri della scheda sono marcati int[] verifica() restituisce un array con i numeri della scheda

Giocatore class Giocatore { private TreeSet scheda; private TreeSet schedaOriginale; private int MAXNUM=90; private int NCELLS=3; private String nome=null; public Giocatore(String nome) { this.nome = nome; initScheda(); }

Giocatore public boolean controllaNumero(int x) { { boolean presente=scheda.remove(x); if (presente) System.out.println(nome+" ha il numero "+x); return presente; } public boolean tombola() { return scheda.isEmpty(); } public Integer] verifica() { return schedaOriginale.toArray(new Integer[0]); }

Giocatore private void initScheda() { Random generatore = new Random(System.currentTimeMillis()/27); scheda = newTreeSet (); for (int i=1; i<=NCELLS; i++) { boolean nuovoNumero=false; do { int x = generatore.nextInt(MAXNUM)+1; nuovoNumero=scheda.add(x); } while (!nuovoNumero); } schedaOriginale=new TreeSet (); schedaOriginale.addAll(scheda); } } // chiude classe Giocatore

Classi Test / Applicazione Ricordiamo Classe applicazione: una classe con un metodo main che contiene codice lanciare la computazione utilizzando le classi che compongono il programma La struttura tipica di una classe test: 1.Costruisci uno o più oggetti 2.Invoca i metodi sulle diverse istanze 3.Stampa i risultati Continua…

Classi Test / Applicazione Le prassi per costruire applicazioni che consistono di più classi variano a seconda del sistema ospite. Tipicamente i passi sono: 1.Crea una nuova directory / folder 2.Costruisci un file per classe e includi nella directory 3.Compila tutti I file della directory 4.Lancia la classe test

File BankAccountApp.java 01: /** 02: Una classe applicazione per la classe BankAccount. 03: */ 04: public class BankAccountApp 05: { 06: /** 07: Testa i metodi della classe BankAccount. args non utilizzato 09: */ 10: public static void main(String[] args) 11: { 12: BankAccount harrysChecking = new BankAccount(); 13: harrysChecking.deposita(2000); 14: harrysChecking.preleva(500); 15: System.out.println(harrysChecking.saldo()); 16: } 17: }

Domanda 7.Quando lanciamo la classe BankAccountApp, quante istanze della classe BankAccount vengono costruite? Quanti oggetti di tipo BankAccountApp ?

Risposta 7.Un oggetto di tipo BankAccount, nessun oggetto di tipo BankAccountTester. Lo scopo della classe applicazione è solo quello di definire il metodo main.

Esercizio Vogliamo estendere la classe BankAccount fornendo ai conti bancari le seguenti caratteristiche: per eseguire le operazioni di prelievo, deposito e richiesta saldo su un conto e necessario prima autenticarsi Una volta che ci siamo autenticati, inizia una sessione durante la quale possiamo eseguire le operazioni; Al termine delle operazioni possiamo chiudere la sessione.

Scope, Lifetime Inizializzazione Variabili e Parametri

Categorie di Variabili Variabili di istanza / campi saldo in BankAccount Variabili locali newsaldo nel metodo deposita() Parametri importo per il metodo deposita()

Categorie di Variabili Variabili di istanza / campi appartengono ad uno (ed un solo oggetto) Lifetime = lifetime degli oggetti a cui appartengono Inizializzati a valori di default Variabili locali ed parametri appartengono ai metodi in cui sono dichiarati Lifetime = esecuzione dei metodi che le dichiarano Parametri inizializzati agli argomenti Variabili locali inizializzate esplicitamente

Consideriamo linvocazione ricordando Lifetime delle variabili harrysChecking.deposita(500); Continua… public void deposita(double amount) { double newBalance = balance + amount; balance= newBalance; }

Lifetime delle variabili Continua… public void deposita(double amount) { double newBalance= balance + amount; balance= newBalance; } harrysChecking.deposita(500);

Lifetime delle variabili Continua… public void deposita(double amount) { double newBalance = balance + amount; balance = newBalance; } harrysChecking.deposita(500);

public void deposita(double amount) { double newBalance= balance + amount; balance = newBalance; } Lifetime delle variabili

public void deposita(double amount) { double newBalance= balance + amount; balance = newBalance; } Lifetime delle variabili

Domanda Quali sono le variabili di istanza e le variabili locali create durante lesecuzione della applicazione BankAccountTester ? 01: /** 02: Una classe test per la classe BankAccount. 03: */ 04: public class BankAccountTester 05: { 06: /** 07: Testa i metodi della classe BankAccount. args non utilizzato 09: */ 10: public static void main(String[] args) 11: { 12: BankAccount harrysChecking = new BankAccount(); 13: harrysChecking.deposita(2000); 14: harrysChecking.preleva(500); 15: System.out.println(harrysChecking.saldo()); 16: } 17: }

Risposta Tre variabili locali harrysChecking newsaldo nel metodo deposita newsaldo nel metodo preleva Una variabile di istanza, saldo allinterno di harrysChecking

Parametri impliciti ed espliciti Ogni metodo ha un parametro implicito, che rappresenta loggetto su cui il metodo viene invocato Il parametro implicito è denotato da this I nomi dei campi nel corpo di un metodo sono riferiti a this

this public void preleva(double importo) { double newsaldo = saldo - importo; saldo = newsaldo; } saldo è il campo delloggetto su cui il metodo viene invocato public void preleva(double importo) { double newsaldo = this.saldo - importo; this.saldo = newsaldo; } esplicitiamo usando this

this Quando invochiamo un metodo su un oggetto, questo viene legato a this. momsSavings.deposita(500) esegue il codice seguente public void preleva(double importo) { double newsaldo = this.saldo - importo; this.saldo = newsaldo; } double newsaldo = momsSavings.saldo - importo; momsSavings.saldo = newsaldo;

this

Domande Quale è il tipo del parametro implicito nel metodo preleva() della classe BankAccount ? Nel metodo preleva(), avrebbe senso utilizzare this.importo al posto di importo ? Quali sono i parametri impliciti ed espliciti del metodo main() della classe BankAccountApp ?

Risposte BankAccount. Non è legale: this ha tipo BankAccount e BankAccount non ha un campo importo. Nessun parametro implicito in quanto il metodo è statico. Un parametro esplicito: args.

Domanda Quali sono gli aspetti comuni tra metodi e funzioni? Quali le differenze?

Risposta I metodi e le funzioni si basano sugli stessi meccanismi di chiamata/ritorno e di passaggio di parametri Differiscono in modo essenziale per il fatto che: un metodo è sempre associato ad un oggetto invocato con un messaggio a quelloggetto una funzione è definita in modo indipendente da un oggetto invocata passando un valore come argomento

Passaggio di parametri Call by value: Copia il valore di ciascun argomento nel corrispondente parametro formale. Non permette di modificare gli argomenti Call by reference: Associa il riferimento di ciascun argomento al corrispondente parametro formale Permette di modificare gli argomenti In Java: call by value Ma passando riferimenti by value otteniamo leffetto desiderato Continua…

Call by value Modifiche dirette dei parametri non hanno effetti sugli argomenti public class BankAccount { public void transfer(double importo, BankAccount otherAccount) { saldo = saldo - importo; double newsaldo = otherAccount.saldo + importo; otherAccount = new BankAccount(newsaldo); // ATTENZIONE } }

Esempio harrysChecking.transfer(500, savingsAccount);

Call by value Un metodo può comunque modificare lo stato degli argomenti di tipo riferimento (anche se non può modificare direttamente gli argomenti)

Domanda Come modifichereste il codice del metodo transfer per ottenere leffetto desiderato? Continua…

Risposta Due possibili soluzioni o meglio ancora public void transfer(double importo, BankAccount other) { saldo = saldo - importo; other.saldo = other.saldo + importo; } public void transfer(double importo, BankAccount other) { this.preleva(importo); other.deposita(importo); }

Scope delle variabili SCOPE DI UNA VARIABILE: la regione che va dalla sua dichiarazione alla fine del blocco in cui la dichiarazione è inclusa Al solito, ma esistono diversi tipi di variabili e diversi tipi di blocchi: Variabili locali: blocco = metodo Campi: blocco dipende dai diritti di accesso definiti nella dichiarazione Continua…

Scope delle variabili locali Variabili con scope diverso sono diverse indipendentemente dal nome: public class RectangleTester { public static double area(Rectangle rect) { double r = rect.getWidth() * rect.getHeight(); return r; } public static void main(String[] args) { Rectangle r = new Rectangle(5, 10, 20, 30); double a = area(r); System.out.println(r); } } Continua…

Scope delle variabili locali ATTENZIONE: lo scope di una locale non può contenere la dichiarazione di una variabile con lo stesso nome … strano ma vero! … Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) { double r = Math.sqrt(x); // ERRORE... }

Dipende dalla loro dichiarazione di accesso. Campi private : accessibili da qualunque punto della classe (in particolare in tutti i metodi della classe) Campi public : accessibili da tutti i metodi della classe e da metodi di altre classi Scope dei campi regole valgono uniformemente tutti gli elementi della classe: campi, metodi, …

Scope e diritti di accesso public class A { private int privata; public int pubblica; private int privM (){ return privata; } public int pubM () { return privM()+ pubblica; } public int binM (A other){ return privata + other.privata;} } public class Test { public void accessi(){ A a1 = new A(); a1.privata = 3; a1.pubblica = 6; a1.privM(); a1.pubM (); A a2 = new A(); a2.binM(a1); }

Scope e diritti di accesso public class A { private int privata; public int pubblica; private int privM (){ return privata; } public int pubM () { return privata + pubblica; } public int binM (A other){ return privata + other.privata;} } public class Test { public void accessi(){ A a1 = new A(); a1.privata = 3; // KO a1.pubblica = 6;// OK a1.privM(); // KO a1.pubM (); // OK A a2 = new A(); a2.binM(a1); // OK }

Scope e diritti di accesso Allinterno di un metodo non è necessario qualificare i campi o metodi delloggetto corrente Membri non qualificati sono riferiti a this public class BankAccount { public void transfer(double importo, BankAccount other) { preleva(importo); // this.preleva(importo); other.deposita(importo); }... }

Scope sovrapposti Una variabile locale, o un parametro, possono mascherare un campo con lo stesso nome public class Coin {... public double getExchangeValue(double exchangeRate) { double value; // Variabile locale... return value; } private String name; private double value; // Campo con lo stesso nome } Continua…

Scope sovrapposti I campi mascherati da locali sono ancora accessibili mediante accessi qualificati da this value = this.value * exchangeRate;

Costruttori regole sintattiche: il nome del costruttore deve essere quello della classe non ha un tipo di ritorno puo essere dotato di qualsiasi modificatore di accesso ogni classe ha almeno il default constructor senza parametri. Il default constructor ha lo stesso livello di accessibilita della classe per cui e definito

Costruttori annidati Quando si hanno piu costruttori, questi possono anche chiamarsi in modo "annidato", usando this(...) public class BankAccount { private int accountNumber; private double saldo; public BankAccount(double saldo) { this.saldo = saldo; } public BankAccount() { this(0); } deve necessariamente essere il primo statement del costrutture

Costruttori e Inizializzazioni Per garantire linizializzazione dei campi di un oggetto possiamo usare anche inizializzazioni esplicite: Assegnando dei valori ai campi dati direttamente al momento della loro dichiarazione Scrivendo dei blocchi di inizializzazione: blocchi di codice definiti dentro la classe ma fuori da metodi e costruttori I blocchi di inizializzazione sono utili per definire una parte di codice comune a tutti i costruttori

Costruttori e Inizializzazioni public class Init { // inizializzazioni esplicite: 1° private int id; private int x = 65; private String name; private Rectangle d = new Rectangle(); private static int nextId = 1; // blocco di inizializzazione: 2° { id = nextId; nextId = nextId +1; } // costruttori: 3° Init(String n){ name=n; } Init(String n, Rectangle d){ name=n;this.d=d; }

Static

Metodi static Esempio public class Financial { public static double percentOf(double p, double a) { return (p / 100) * a; } //... }

Metodi static Altri esempi ben noti main() i metodi della classe Math Math.sqrt(x) Radice quadrata Math.pow(x, y) Potenza x y Math.exp(x) Esponenziate e x Math.log(x) Logaritmo naturale Math.sin(x), Math.cos(x), Math.tan(x) Funzioni trigonometriche (x in radianti) Math.round(x) Attotondamento Math.min(x,y), Math.max(x,y) Minimo, massimo

Metodi static Sono definiti allinterno di classe, ma … non sono associati ad oggetti non sono invocati su oggetti Quando definire un metodo static? quando il metodo opera solamente sui propri parametri

Metodi static Poichè appartengono alla classe e non sono riferibili ad alcuna istanza, allinterno di questi metodi il parametro implicito this è indefinito Quindi allinterno di questi metodi non si può far riferimento ad alcun campo delloggetto corrente

Metodi static Attenzione agli accessi public class BankAccount {... public static boolean sameBalance(BankAccount other) { return other.saldo == saldo; // ERRORE! }... }

Metodi static Correggiamo così public class BankAccount {... public static boolean sameBalance(BankAccount other) { return other.saldo == saldo; // OK }... }

Metodi static Correggiamo così public class BankAccount {... public static boolean sameBalance(BankAccount b1, BankAccount b2) { return b1.saldo == b2.saldo; // OK }... }

Metodi static Oppure così public class BankAccount {... public static boolean sameBalance(BankAccount b1, BankAccount b2) { return b1.saldo == b2.saldo; // OK }... }

Chiamata di metodi statici Allinterno della classe in cui sono definiti Stessa sintassi utilizzata per i metodi non-static Allesterno della classe di definizione Utilizziamo il nome della classe invece del riferimento ad un oggetto: double tax = Financial.percentOf(taxRate, total);

Domande È corretto invocare x.pow(y) per calcolare x y ? Quale delle due istruzioni è più efficiente tra x*x e Math.pow(x,2)

Risposte No: x è un numero, non un oggetto, e non è possibili invocare un metodo su un numero x*x la seconda espressione coinvoge una chiamata di metodo, passaggio di parametri … etc, tutte operazioni costose

Domanda Come utilizzereste la classe MyMath qui di seguito per calcolare la radice quadrata di 5? public class MyMath { public double sqrt(double x) { return Math.sqrt(x); }

Risposta (new MyMath()).sqrt(5);

Campi static (class variables) Un campo static appartiene alla classe, non ad alcuna delle istanze della classe Una sola copia di lastAssignedNumber, accessibile solo allinterno della classe public class BankAccount {... private double saldo; private int accountNumber; private static int lastAssignedNumber = 1000; }

Campi static La nuova definizione del costruttore Questo è un uso tipico dei campi static Altro caso di utilizzo: definizione di costanti (campi static e final) /** Genera il prossimo numero di conto da assegnare */ public BankAccount() { lastAssignedNumber++; accountNumber = lastAssignedNumber; }

Campi e campi static

Campi static Tre modalità di inizializzazione: 1.Automatica: inizializzati ai valori di default. 2.Mediante un inizializzatore esplicito 3.Mediante un blocco di inizializzazione static public class BankAccount {... private static int lastAssignedNumber = 1000; // Eseguito una volta sola, // quando la classe viene caricata } Continua…

Allocazione/Deallocazione: vengono creati quando viene caricata la classe, continuano ad esistere finchè esiste la classe, quindi durante tutta l'esecuzione. Campi static

Come tutti i campi, preferibilmente dichiarati private Eccezioni: costanti public class BankAccount {... public static final double OVERDRAFT_FEE = 5; // riferita mediante il nome qualificato // BankAccount.OVERDRAFT_FEE }

Accesso ai campi static Allinterno della classe in cui sono definiti Stessa sintassi utilizzata per i campi non-static Da una classe diversa da quella di definizione Utilizziamo il nome della classe invece del riferimento ad un oggetto: double fee = BankAccount.OVERDRAFT_FEE; Printstream ps = System.out;

Domanda Listruzione System.out.println(4) denota una chiamata di metodo static?

Risposta No: il metodo println() è invocato qui sulloggetto System.out

Costanti: final Una variabile final è una costante Una volta inizializzata, non è possibile modifcarne il valore Convenzione: i nomi delle variabili usano solo caratteri MAIUSCOLI final double QUARTER = 0.25; final double DIME = 0.1; final double NICKEL = 0.05; final double PENNY = 0.01;

Constanti: static final Costanti utilizzate da più di un metodo possono essere dichiarate come campi, e qualificate come static e final Le costanti static final possono inoltre essere dichiarate public per renderle disponibili ad altre classi public class Math {... public static final double E = ; public static final double PI = ; } double circonferenza = Math.PI * diametro;

La classe Pila - 1 class Pila { private int size; private int defaultGrowthSize; private int marker; private contenuto[]; final int INITSIZE=3; public Pila() { size=initialSize; defaultGrowthSize=INITSIZE; marker=0; contenuto=new int[size]; }

La classe Pila - 2 private void cresci(int dim){ size+=dim; int temp[ ]=new int[size]; for (int k=0;k<marker;k++) temp[k]=contenuto[k]; contenuto=temp; }

La Classe Pila - 3 public void inserisci(int k) { if (marker==size){ cresci(defaultGrowthSize;)} contenuto[marker]=k; marker++; }

La Classe Pila - 4 public int estrai() { if (marker==0) { System.out.println( "Non posso estrarre da una pila vuota"); System.exit(1); } return contenuto[--marker]; }

Packages Package: insieme di classi e interfacce in relazione Per formare un package basta inserire la direttiva come prima istruzione nel file sorgente Una sola direttiva per file Classi contenute in file che non dichiarano packages vengono incluse in un package anonimo package anonimo OK solo per micro applicazioni, o in fase di sviluppo package packageName; Continua…

PackageFinalitàClasse Tipica java.langSupporto al linguaggioMath, String java.utilUtilitiesRandom java.ioInput e OutputPrintStream Java.awtAbstract Window ToolkitColor Java.appletAppletsApplet Java.netNetworkingSocket Java.sqlAccesso a databaseResultSet Java.swingIngerfaccia utente SwingJButton ……… Packages

Per accedere ai tipi di un package utilizziamo il nome qualificato Uso dei nomi qualificati verboso import permette sintesi java.util.Scanner in = new java.util.Scanner(System.in); import java.util.Scanner;... Scanner in = new Scanner(System.in) Accesso agli elementi di un package

Import di una classe di tutte le classi di un package import java.util.*; import java.util.Scanner;... Scanner in = new Scanner(System.in) Continua…

Import Packages non formano gerarchie Static import delle costanti e metodi statici dei tipi di un package // import dei tipi di java.awt.color import java.awt.color.*; // import dei tipi di java.awt (non del package color!) import java.awt.*;// import dei tipi di java.awt. import static java.lang.Math.PI import static java.lang.Math.*;.

Nomi di package Packages utili anche come namespaces per evitare conflitti di nomi (per classi/interfacce) Esempio, Java ha due classi Timer Nomi di package devono essere univoci Convenzione: utilizziamo come prefissi domini internet, oppure indirizzi (in ordine inverso) java.util.Timer vs. javax.swing.Timer it.unive.dsi it.unive.dsi.mp Continua…

Localizzazione di package Nomi di package devono essere consistenti con i path della directory che li contengono Deve essere contenuto in un folder/directory localizzato nel path corrispondente WINDOWS: \it\unive\dsi\mp\banking it.unive.dsi.mp.banking UNIX: /it/unive/dsi/mp/banking Continua…

Localizzazione di package CLASSPATH: definisce le directory base dove localizzare i packages Spesso utili due directory base per file sorgenti (.java) per file compilati (.class) UNIX: export CLASSPATH=/home/mp/java/src:/home/mp/java/classes:. WINDOWS: set CLASSPATH=c:\home\mp\java\src;\home\mp\java\classes;.