Metodi. Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere:

Documenti analoghi
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Definizione di metodi

14 - Metodi e Costruttori

Definizione di classi. Walter Didimo

Definizione di metodi

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Programmazione a oggetti

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

Introduzione alla Programmazione in Java attraverso un esempio commentato

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Java: Definire Classi e Creare Oggetti

Definizione di metodi in Java

Concetto di Funzione e Procedura METODI in Java

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

Corso sul linguaggio Java

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

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Metodi statici. Dichiarazione e chiamata di metodi statici

Il linguaggio C. Puntatori e dintorni

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Esempio 2: Subtyping

Introduzione Programmazione Java

Funzioni, Stack e Visibilità delle Variabili in C

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

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

Programmazione (imperativa)

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

Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Laboratorio di programmazione

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Operazioni numeriche - Input

Java Le stringhe. Stringhe

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

GESTIONE DEGLI ERRORI

Pubblico e privato. Per capire il concetto di pubblico e privato è possibile pensare a diversi oggetti del mondo reale. Ad esempio: bancomat.

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Introduzione a Java. Giovanni Pardini Dipartimento di Informatica Università di Pisa.

TIPI PRIMITIVI: LIMITI

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

La Gestione della Memoria. Carla Binucci e Walter Didimo

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Strategie di programmazione

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

Laboratorio di Programmazione 1 [Java]

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

Uso di metodi statici. Walter Didimo

Laboratorio di reti I

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

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Corso di Informatica

public protected private private package

Programmazione ad oggetti

Oggetti e classi. Cos è un oggetto

Le basi del linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Programmazione Procedurale in Linguaggio C++

nome (lista_parametri) Funzioni funzioni predefinite: sqrt(x) log(x) usare queste funzioni significa: specificare il valore degli argomenti

Proprietà delle Classi e degli Oggetti in Java

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Modulo 2: Strutture fondamentali della programmazione Java

Le eccezioni in Java

C: panoramica. Violetta Lonati

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

Programmazione ad Oggetti

Fondamenti di Programmazione

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Esempio: Costruttori ed ereditarietà

Gestione delle eccezioni in Java

Programmazione, 5 a lezione

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Funzioni. (Passaggio dei parametri per riferimento) Passaggio dei parametri

Le funzioni in JavaScript. Modularizzazione

Lezione 6 programmazione in Java

Le basi del linguaggio Java

Introduzione all uso degli oggetti in Java (parte II) Walter Didimo

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione con Java

Programmazione II Compitino (Vers. B)

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

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Uguaglianza e copia di oggetti

Introduzione al linguaggio C Puntatori

Il problema è trovare un modo nel quale gli eventi dell oggetto di riferimento, siano comunicati a tutti gli altri interessati.

Esempio su strutture dati dinamiche: ArrayList

Questi lucidi provengono dal capitolo 2 di:

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Linguaggio C: le funzioni. Introduzione e sintassi

Algoritmi di Ricerca. Esempi di programmi Java

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

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

Algoritmi di Ricerca. Esempi di programmi Java

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

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Transcript:

Metodi Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere: invocazione: esecuzione di un metodo assegnamento: cambia lo stato di un campo ripetizione: esegue istruzioni più volte selezione: valuta condizioni ed esegue alternative eccezione: gestisce situazioni anomale

Metodi Per richiedere a un oggetto di eseguire un operazione bisogna mandargli un messaggio opportuno. Bisogna specificare: il messaggio che si invia l oggetto che deve eseguirlo (parametro implicito che viene identificato come this) rif_oggetto. nome_metodo(argomenti [...]);

Metodi La definizione di un metodo è composta di due parti: intestazione + corpo. public int unmetodo(int x, int y) { if (x<0) return -1; else { this.potenza = Math.pow(x,y); return x; } }; intestazione corpo L intestazione è quanto precede le graffe. Il corpo è quanto vi è contenuto e descrive l implementazione del metodo.

Metodi L intestazione fornisce le seguenti informazioni su come utilizzare il metodo: modificatori (opzionali): final, static, public,... tipo di ritorno del metodo (primitivo / riferimento) nome del metodo lista dei parametri

Metodi Un sottoinsieme dell intestazione è dato dal prototipo del metodo: comprende il tipo di ritorno, il nome, i parametri. Un sottoinsieme del prototipo è la firma: comprende solo il nome e i parametri. intestazione public int unmetodo(x,y) prototipo firma

Metodi Una classe può avere più metodi con lo stesso nome: overloading (sovraccarico) del metodo. Tuttavia, non possono esserci più metodi con la stessa firma. In altre parole, due metodi possono avere lo stesso nome ma devono differire per il numero dei parametri (non basta un diverso tipo di ritorno) L overloading viene risolto in fase di compilazione.

Metodi Per il compilatore il metodo è identificato dalla sua firma. L unicità della firma garantisce la selezione non ambigua del metodo nell ambito di una classe. L uso dell overloading consente di non dovere introdurre nomi diversi per metodi con funzionalità simili ma che operano su argomenti diversi.

Variabili locali Le variabili definite nel corpo di un metodo prendono il nome di variabili locali. Non hanno mai indicazioni private o public. Quando il metodo termina (ad esempio a seguito di un return) vengono distrutte A differenza dei campi (variabili d istanza) dell oggetto non vengono automaticamente inizializzate.

Parametri Le variabili dichiarate nell intestazione del metodo sono dette parametri formali. Inoltre, c è il parametro implicito this. Distinguiamo tra: nomi dei parametri (usati relativamente al metodo) che sono i parametri formali valori assunti dai parametri al di fuori da esso chiamati parametri attuali o argomenti I parametri vengono inizializzati ai valori degli argomenti quando il metodo viene chiamato.

Parametri Le variabili dei parametri sono in effetti come le altre variabili locali del metodo. Quando il metodo termina, vengono distrutte anch esse. Possono anche essere modificate nel corpo. public int unmetodo(int x, int y) { x = 5; //ammesso, ma pessimo stile return y; }; Farlo però è considerato pessimo stile: semanticamente x dovrebbe rimanere costante.

Tipo di ritorno Se il tipo di ritorno è void, il metodo termina con l ultima istruzione. Altrimenti è obbligatorio usare un istruzione: return espressione che restituisce un valore e termina l esecuzione. Il compilatore controlla che il metodo esegua per forza un return e anche che l espressione che segue return sia compatibile con il tipo di ritorno indicato per il metodo.

Invocazione Quando un oggetto invoca un metodo di un altro si parla di chiamata di metodo esterno. Se invece un oggetto invoca un suo proprio metodo si tratta di chiamata di metodo interno. In questo caso non è necessario usare this: si parla di autoreferenziazione. Un metodo d istanza può accedere ai campi dell oggetto (variabili d istanza) senza usare this. Solo se non c è una variabile locale con quel nome.

Invocazione Quando un oggetto o1 invia un messaggio a un oggetto o2 per invocare un suo metodo m: o1 smette di fare quello che stava facendo e si mette in uno stato di attesa o2 esegue il metodo m sulla base del messaggio ricevuto (parametri passati) quando o2 ha finito l esecuzione delle istruzioni contenute nel corpo di m, o2 passa il controllo a o1 che riprende dal punto in cui si era fermato

Invocazione Questo modello di esecuzione Java viene detto a singolo thread (=filo) di esecuzione. Nel caso a singolo thread, quando due o più metodi sono attivati, solo uno è effettivamente in esecuzione (l ultimo che è stato attivato) Java consente anche di scrivere programmi multi-thread, ossia che hanno più metodi in esecuzione simultanea (programmazione parallela).

Invocazione Si parla anche di trasferimento di controllo nel caso a singolo thread, il controllo è unico. solo l oggetto con il controllo può eseguire azioni quando un oggetto invoca un metodo di un altro oggetto, gli cede il controllo quando un oggetto termina di eseguire il metodo, restituisce il controllo a chi glielo aveva ceduto.

Ricorsione È un caso particolare di trasferimento di controllo, in cui non solo o1 e o2 coincidono (quindi è una chiamata di metodo interno) ma il metodo m chiama sé stesso. Esempio: calcolo del fattoriale di un numero. factorial(n) viene calcolato come n * factorial(n-1). Attenzione a impostare bene le condizioni per una corretta ricorsione.

Ricorsione public static int factorial(int n) { if (n < 0) throw new IllegalArgumentException(); else if (n == 0) return 1; else { int result = n * factorial(n-1); return result; } }

Eccezioni Che fare quando un metodo viene invocato con un parametro non consentito? Si può impostare il metodo in modo che non faccia nulla e restituisca il controllo al chiamante, facendolo terminare con un istruzione return. O si può invocare System.exit(codice) che fa terminare il programma. Oppure, alternativa più sofisticata: invocare un eccezione.

Eccezione Esempio di sintassi: intestazione metodo(parametro) { if (parametro_non_valido) throw new IllegalArgumentException(); else { prosegui.. } }

Eccezione A questo punto l eccezione che abbiamo invocato deve essere gestita. Questo può essere fatto direttamente, oppure viene restituito il controllo al chiamante, e al limite terminato il programma. L aspetto importante è che il chiamante può cercare di fare il possibile per gestire l eccezione e risolvere il problema.

Metodi statici I metodi sono definiti all interno di una classe. Vengono poi tipicamente invocati utilizzando una variabile riferimento che tiene traccia dell istanza di un oggetto. Questo rende possibile l autoreferenziazione Infatti durante l esecuzione del metodo, this ha il valore di questa variabile. Ma se un metodo richiede un oggetto, come far partire il sistema (quando di oggetti ancora non ne esistono?)

Metodi statici La soluzione è usare un metodo speciale che non richiede oggetti e può essere usato in qualunque momento: un metodo statico. Il metodo main deve essere statico Inoltre esistono casi in cui vogliamo dei servizi senza avere oggetti a cui chiederli. se manipoliamo numeri se ci serve un metodo generale che funzioni anche se non esistono oggetti di quella classe (e non vogliamo creare un oggetto dummy)

Metodi statici Il metodo main viene indicato alla JVM come primo metodo da eseguire. Per questo dev essere static, perché quando viene eseguito non ci sono ancora oggetti, e public, perché la JVM possa accederlo. In realtà ogni classe può avere il suo metodo main ma solo quello della classe che viene eseguita sarà l entry point dell applicazione.

Metodi statici Diversamente dagli altri metodi (d istanza) i metodi statici destinano il loro messaggio alla classe, anziché a un oggetto. nome_classe. nome_metodo(argomenti [...]); I metodi statici non hanno quindi il parametro implicito: non possono usare this.

Metodi statici I metodi non statici possono accedere a tutti i membri della classe, anche statici (es. le variabili di classe, che sono campi statici). Non vale il viceversa: un metodo statico può accedere solo membri statici. Quindi non può cambiare un campo non statico della classe. La cosa è sensata, perché c è una variabile per ogni istanza della classe: quale dovrebbe usare il metodo statico?

Metodi statici Ad esempio la classe Studente potrebbe avere un campo statico: static String corsolaurea Stiamo quindi dicendo che la variabile è una sola per tutta la classe Studente Possiamo pensare di avere un metodo statico per cambiare questa variabile: public static void setcorso (String nome) Impostare Studente.corsoLaurea = nome; è corretto (metodo statico, campo statico).

Metodi statici privati A volte un metodo può: essere non legato a un singolo oggetto avere funzioni interne, cioè di utilità solo per la classe stessa dove è inserito Ad esempio, questo potrebbe capitare per metodi da usare nei costruttori. In questo caso, il metodo può essere private static. static perché serve a tutta la classe, private perché non serve al di fuori di essa.

Combinare metodi Esistono due modi per combinare più invocazioni di metodi. 1) Composizione si usa il risultato di un invocazione come argomento in un altra invocazione String a,b,c,d;... d = a.concat(b.concat(c)); eseguito dopo eseguito prima

Combinare metodi 2) Cascata si usa il risultato di un invocazione come oggetto destinatario (parametro implicito) di un altra invocazione di metodo String a,b,c,d;... d = a.concat(b).concat(c); eseguito prima eseguito dopo

Passaggio dei parametri Quando si invoca un metodo, vengono passati i parametri. Dato che le variabili parametro vengono inizializzate ai valori degli argomenti (che vengono cioè copiati ), di fatto stiamo realizzando un passaggio per valore. Questo meccanismo ha delle limitazioni, e Java non consente il passaggio per riferimento (come ad esempio in C).

Passaggio dei parametri Conseguenze in qualche modo diverse per tipi primitivi (numeri) o tipi riferimento (oggetti) La variabile del parametro formale viene inizializzata al valore del parametro attuale, e tra i due valori c è totale indipendenza. Per entrambi il passaggio è per valore, e non si può cambiare il parametro attuale. Però possono sorgere effetti collaterali.

Passaggio dei parametri In effetti quando la variabile passata è di tipo riferimento, lei stessa non può essere modificata ma, tramite un effetto collaterale, lo può essere l oggetto a cui essa punta. Anche se non è propriamente corretto, spesso si sente quindi dire che gli oggetti Java sono passati per riferimento. La verità è che le variabili istanza contengono riferimenti e quindi non possono essere cambiate, ma può esserlo l area a cui puntano.

Esempio Definiamo intanto un tipo Numero (doppione del tipo primitivo int, ma è un oggetto) class Numero CAMPO { private int num; COSTRUTTORE public Numero(int x) {this.num = x;} public int getnum() (return this.num;} public void setnum(int x) {x = this.num;} } METODI (get, set)

Esempio class Prova { public static void met(int k) { System.out.println(k); //stampa 5 k++; System.out.println(k); //stampa 6 } public static void main(string[] args) { int k; k = 5; System.out.println(k); //stampa 5 met(k); System.out.println(k); //stampa? 5 } }

Esempio class Prova { public static void met(numero k) { System.out.println(k.getNum()); //stampa 5 k = new Numero(6); System.out.println(k.getNum()); //stampa 6 } public static void main(string[] args) { Numero k = new Numero(5); System.out.println(k.getNum()); //stampa 5 met(k); System.out.println(k.getNum()); //stampa? 5 } }

Esempio In questa versione, bisogna ovviamente usare il metodo get per accedere k che è un Numero (non più int). Il metodo met, che viene invocato dal main, crea internamente a sé stesso un riferimento al numero 6. Questo riferimento sovrascrive il valore che k tiene dentro al metodo. Ma, terminato il metodo, la versione locale di k viene distrutta. Il main stamperà due volte 5.

Esempio class Prova { public static void met(numero k) { System.out.println(k.getNum()); //stampa 5 k.setnum(6); System.out.println(k.getNum()); //stampa 6 } public static void main(string[] args) { Numero k = new Numero(5); System.out.println(k.getNum()); //stampa 5 met(k); System.out.println(k.getNum()); //stampa? 6 } }

Effetti collaterali Stavolta, il valore è stato cambiato. In effetti la variabile k è passata per valore (cosicché il parametro formale k viene a coincidere col parametro attuale k). Questo parametro in effetti è davvero trasmesso per valore. Solo che, essendo k un riferimento, nulla vieta che l area di memoria a cui punta venga acceduta e cambiata: effetto collaterale!

Effetti collaterali L oggetto k di tipo Numero viene modificato dal metodo met in cui è un parametro esplicito. Tutte le volte che un metodo modifica un oggetto che non sia il suo parametro implicito si parla di effetto collaterale. Il metodo set è basato su un unico effetto collaterale.

Effetti collaterali Un effetto collaterale può modificare due tipi di oggetti: un parametro esplicito un campo statico pubblico In generale, gli effetti collaterali sono tanto più indesiderabili quanto meno si riescono a tenere sotto controllo. Se compaiono come errori di programmazione sono molto difficili da trovare.