Variabili e Parametri

Похожие документы
Livelli di astrazione

Capitolo 3. Realizzare classi

Definizione di classi. Walter Didimo

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

14 - Metodi e Costruttori

Progettare le Classi

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Programmazione a oggetti

sayhello public private protected return public class Greeter { public String sayhello() { String message = Hello, World! ; return message; } }

DataSet. ... public BankAccount getmaximum() { return x; }... private BankAccount maximum;... } DataSet

Proprietà delle Classi e degli Oggetti in Java

18 - Classi parzialmente definite: Classi Astratte e Interfacce

GESTIONE DEGLI ERRORI

Rectangle BankAccount Purse

Esercitazione n 2. Obiettivi

Esempio: il conto bancario

Capitolo 3. Realizzare classi. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Lezione 9 programmazione in Java Classi come contenitori

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Programmazione con Java

Metodi statici. Dichiarazione e chiamata di metodi statici

Esempio 2: Subtyping

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Modulo 2: Strutture fondamentali della programmazione Java

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Laboratorio di Programmazione 1 [Java]

Uguaglianza e copia di oggetti

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Parola chiave extends

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

Progettazione di classi

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

La Gestione della Memoria. Carla Binucci e Walter Didimo

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Uso di metodi statici. Walter Didimo

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Classi ed Oggetti in JAVA

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso di Programmazione ad Oggetti

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Programmazione Java: Variabili membro, Metodi La parola chiave final

Progettazione di classi

Esempio: L EURO-CONVERTITORE (1) Scopo

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Транскрипт:

Variabili e Parametri Scope, Lifetime Inizializzazione Categorie di Variabili Variabili di istanza / campi saldo in BankAccount Variabili locali newsaldo nel metodo deposita() Parametri importo per il metodo deposita() 1

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 Lifetime delle variabili Consideriamo l invocazione harryschecking.deposita(500); ricordando public void deposita(double amount) double newbalance = balance + amount; balance= newbalance; Continua 2

Lifetime delle variabili harryschecking.deposita(500); public void deposita(double amount) double newbalance= balance + amount; balance= newbalance; Continua Lifetime delle variabili harryschecking.deposita(500); public void deposita(double amount) double newbalance = balance + amount; balance = newbalance; Continua 3

Lifetime delle variabili 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; 4

Domanda Quali sono le variabili di istanza e le variabili locali create durante l esecuzione 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. 08: @param 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 all interno di harryschecking 5

Parametri impliciti ed espliciti Ogni metodo ha un parametro implicito, che rappresenta l oggetto 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 dell oggetto su cui il esplicitiamo metodo viene invocato usando this public void preleva(double importo) double newsaldo = this.saldo - importo; this.saldo = newsaldo; 6

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

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. 8

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 quell oggetto una funzione è definita in modo indipendente da un oggetto invocata passando un valore come argomento 9

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 l effetto 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 10

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) 11

Domanda Come modifichereste il codice del metodo transfer per ottenere l effetto desiderato? Continua Risposta Due possibili soluzioni public void transfer(double importo, BankAccount other) saldo = saldo - importo; other.saldo = other.saldo + importo; o meglio ancora public void transfer(double importo, BankAccount other) this.preleva(importo); other.deposita(importo); 12

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 13

Scope delle variabili locali ATTENZIONE: lo scope di una locale non può contenere la dichiarazione di una variabile con lo stesso nome Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) double r = Math.sqrt(x); // ERRORE... strano ma vero! Scope dei campi 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 regole valgono uniformemente tutti gli elementi della classe: campi, metodi, 14

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 15

Scope e diritti di accesso All interno di un metodo non è necessario qualificare i campi o metodi dell oggetto 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 16

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 17

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 l inizializzazione 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 18

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; 19