Il passaggio dei parametri Metodi statici Il riferimento this

Slides:



Advertisements
Presentazioni simili
Programmazione Corso di laurea in Informatica
Advertisements

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
30/10/01Array 1  Un array e’ una struttura dati che contiene piu’ valori del medesimo tipo.  La lunghezza di un array e’ stabilita quando l’array viene.
6/11/01Ordinamento 1 Un esempio di algoritmi: ordinamento.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Table View. Problemi ricorrenti Una situazione ricorrente è quella in cui il controller potrebbe avere un’altezza superiore a quella dello schermo. In.
Le funzioni in C++. Introduzione  Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo programma  Si pensi.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
Programmazione orientata agli Oggetti. Classi Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma anche il codice.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Basi di dati - Fondamenti
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Tecnologia OO.
ODMG.
Java: concetti e costrutti base
Introduzione al linguaggio C
Esercizi.
Tutorato Elementi di Informatica 2013
7. Strutture di controllo Ing. Simona Colucci
10. Programmazione Ricorsiva Ing. Simona Colucci
Strutture classi e oggetti
Programmazione a oggetti
Process synchronization
Programmazione a oggetti
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
Informatica per l’Ingegneria
Vettori dinamici Definiremo la classe vector.
Process synchronization
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
OBJECT ORIENTED DATABASE
Basi di dati - Fondamenti
Programmare.
Secondo Programma in C.
Esercitazioni di C++ 31 dicembre 2018 Claudio Rocchini IGMI.
Oggetti Java.
Programmazione e Laboratorio di Programmazione
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
Vari e semplici programmi.
Fondamenti di Informatica
TDE
Ricorsione 16/01/2019 package.
© 2007 SEI-Società Editrice Internazionale, Apogeo
I SOTTOPROGRAMMI.
Definizione di linguaggio di programmazione
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
La struttura dei primi programma in C
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Lucidi della Pof.ssa Pazienza
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Programmazione e Laboratorio di Programmazione
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Java Costruttore di copia e GetStatus.
Esercizio 2.
Selezione e Proiezione
Corso Java Lezione 1 5/12/2019.
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
Programmazione e Laboratorio di Programmazione
Ese 1 (del 31 Marzo 2004).
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

Il passaggio dei parametri Metodi statici Il riferimento this 11/01/2019 Metodi

I sottoprogrammi I sottoprogrammi ( o subroutine, o metodi) sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il riutilizzo del codice. Essi consentono al programmatore di concentrarsi su una parte del problema. I parametri del sottoprogramma rappresentano i dati che il sottoprogramma usa per svolgere il compito assegnato. Vantaggi dell’uso di sottoprogrammi: Possibilità di modularizzare i programmi, rendendoli più leggibili; Riusabilità del Software: possibilità di riutilizzare porzioni di codice in punti diversi del programma o in programmi diversi (evita la duplicazione del codice). 11/01/2019 Metodi

I sottoprogrammi Un sottoprogramma è una sequenza di istruzioni che vengono attivate a seguito di una chiamata Lo scambio di informazioni fra sottoprogramma e codice chiamante avviene attraverso il passaggio di zero o più parametri in ingresso e un (eventuale) valore restituito in uscita. Parametri in ingresso Parametri formali (specificati nella definizione del sottoprogramma stesso): simboli che rappresentano i dati su cui il sottoprogramma opera Parametri attuali (specificati nella chiamata del sottoprogramma): dati corrispondenti ai parametri formali, su cui il sottoprogramma effettivamente opera In Java i sottoprogrammi si chiamano metodi e sono definiti sempre all’interno di una classe. Parametri in ingresso Valore restituito sottoprogramma 11/01/2019 Metodi

Definizione di metodi La dichiarazione di un metodo specifica le istruzioni che verranno eseguite quando il metodo è invocato (chiamato). Quando viene invocato un metodo, il flusso di controllo passa al metodo ed vengono eseguite le istruzioni definite nel metodo. Quando l’esecuzione del metodo termina, il flusso di controllo ritorna al punto in cui era stato chiamato il metodo e l’esecuzione continua dall’istruzione successiva alla chiamata. La chiamata puo’ restituire un valore o no, in dipendenza da come e’ stato definito il metodo. 11/01/2019 Metodi

Flusso di controllo di un metodo Quando si incontra la chiamata di un metodo il controllo viene trasferito alla prima istruzione del metodo stesso. Il flusso di esecuzione torna al codice chiamante quando si incontra una istruzione return (che restituisce il valore specificato) oppure al termine del codice del metodo per metodi definiti void. Il metodo chiamato può essere definito nella stessa classe, nel qual caso per chiamarlo e’ sufficiente il nome del metodo. myMethod(); myMethod compute 11/01/2019 Metodi

Passaggio di parametri Ogni volta che un metodo viene chiamato, i parametri attuali usati nella chiamata vengono copiati nei parametri formali. char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } ch = obj.calc (25, count, "Hello"); 11/01/2019 Metodi

Definizione del metodo esempio Utilizzo del valore restituito Metodi public class Esempio { private static int esempio(int a){ int risultato; risultato = a*2; return risultato; } static public void main(String[] args) int ris = esempio(1); System.out.println(ris); Definizione del metodo esempio Parametri formali Valore restituito Chiamata del metodo Parametri attuali Utilizzo del valore restituito Si noti che le due variabili ris e risultato sono completamente indipendenti fra di loro 11/01/2019 Metodi

Metodi ricorsivi Un metodo puo’ richiamare se stesso. In questo caso il metodo e’ detto ricorsivo. public static int fattoriale(int n){ int ris; if(n>1) ris = n * fattoriale(n-1); else ris = 1; return ris; } … nfat = fattoriale(3); fattoriale(3) richiama fattoriale(2) fattoriale(2) richiama fattoriale(1) fattoriale(1)  1 fattoriale(2)  2* fattoriale(1) fattoriale(3)  3* fattoriale(2)  3*(2* fattoriale(1))3*2*1 11/01/2019 Metodi

Il passaggio di parametri per valore Secondo la modalità del passaggio per valore ogni metodo ha una propria zona di memoria per memorizzare i dati (in Java messa a disposizione solo al momento dell’effettivo utilizzo e rilasciata quando non è più necessaria dal garbage collector). Al momento della chiamata del metodo, i parametri attuali vengono ricopiati nei parametri formali, quindi non è possibile riferirsi dal metodo ai valori del codice chiamante. static void sottoprogramma(int a) { //… … a = 2; } // … … int b=3; sottoprogramma(b); System.out.println(“b=”+b); b=3 11/01/2019 Metodi

Il riferimento this Esiste un particolare identificatore che fa riferimento sempre all’oggetto corrente: tale riferimento è identificato dalla parola chiave this. A meno di ambiguità si può omettere. public class Dato { public int val; public Dato(int val) { this.val = val; } this.val è il campo val dell’oggetto corrente, val è il parametro formale del costruttore 11/01/2019 Metodi

Il passaggio per valore static void scambia(int a, int b) { int tmp=a; a=b; b=tmp; } // … … int a=2, b=3; scambia(a, b); System.out.println(“a=” +a+“ b=”+b); Non vi è corrispondenza fra i nomi di metodi diversi a=2 b=3 Non ho ottenuto il risultato voluto a causa del passaggio per valore 11/01/2019 Metodi

L’uso di riferimenti static void scambia(Dato a, Dato b) { int tmp=a.val; a.val =b.val; b.val =tmp; } // … … Dato a = new Dato(2), b = new Dato(3); scambia(a, b); System.out.println(“a=” +a.val+“ b=”+b.val); Tramite i riferimenti accedo allo stesso oggetto in memoria, in questo caso si è copiato il riferimento a=3 b=2 Tramite l’uso dei riferimenti posso simulare il passaggio per indirizzo 11/01/2019 Metodi

L’uso di riferimenti static void scambia(Dato a, Dato b) { Dato tmp = a; a = b; b = tmp; } // … … Dato a=new Dato(2), b= new Dato(3); scambia(a, b); System.out.println(“a=” +a.val+“ b=”+b.val); a=2 b=3 11/01/2019 Metodi

L’uso di riferimenti static void scambia(Dato[] v, int i, int j) { Dato tmp = v[a]; v[i] = v[j]; v[j] = tmp; } // … … Dato[] vet = new Dato[5]; vet[1] = new Dato(2); vet[3] = new Dato(3); scambia(vet, 1, 3); System.out.println(“v[1]=” +v[1].val+“v[3]=”+v[3].val); a=3 b=2 11/01/2019 Metodi

Metodi di istanza I metodi di istanza hanno sempre un parametro implicito: il riferimento all’oggetto corrente (this) public class Dato { // … … public void incrementa() { this.val++; } in questo caso è equivalente scrivere val++ // uso Dato d = new Dato(1); d.incrementa(); System.out.println(d.val); 2 11/01/2019 Metodi

I metodi Il codice seguente è equivalente public class Dato { // … … public static void incrementa(Dato d) { d.val++; } // uso Dato d = new Dato(1); Dato.incrementa(d); System.out.println(d.val); 2 11/01/2019 Metodi

I metodi I due approcci possono coesistere e richiamarsi public class Dato { // … … public static void incrementa(Dato d) { d.val++; } public void incrementa() { incrementa(this); I due metodi si distinguono per il numero e il tipo di parametri Dato.incrementa ha bisogno di un parametro di tipo Dato, posso utilizzare il riferimento this In questo caso non devo scrivere Dato.incrementa perchè sono all’interno della classe 11/01/2019 Metodi

Metodi statici Metodi statici sono metodi che non fanno riferimento in maniera esplicita a istanze di una classe. Possono fare riferimento solo a campi statici della stessa classe (informazioni presenti in una unica copia per tutte le istanze della classe stessa) Un metodo di istanza che modifica lo stato dell’oggetto, dovrebbe essere definito come void. Un metodo può restituire un riferimento o un valore (tipo base) 11/01/2019 Metodi

Overloading dei metodi L’overloading di metodi e’ il processo attraverso cui e’ possibile usare lo stesso noime per piu’ metodi. La segnatura di ciascun metodo deve essere unica. La segnatura include il numero, il tipo e l’ordine dei parametri. Il compilatore deve essere in grado di determinare quale versione del metodo deve essere invocata analizzandone I parametri passati. Il tipo del valore restituito non fa parte della segnatura. 11/01/2019 Metodi

Esempio di overloading float prod (int x) { return x + .375; } Version 1 float prod (int x, float y) return x*y; Version 2 result = prod (25, 4.32) Invocation 11/01/2019 Metodi

Costruttori I costruttori sono dei metodi particolari richiamati attraverso l’operatore new Servono per creare una nuova istanza (oggetto) di una certa classe Hanno per nome il nome della classe ogni classe ne può avere più di uno Si distinguono per il numero ed il tipo dei parametri 11/01/2019 Metodi

Classe Studente public class Studente { static private int contatore=0; private int matricola; private String nome, cognome; public Studente(String nome, String cognome) { this.nome = nome; this.cognome = cognome; matricola = contatore++; } public String toString() { int controllo=matricola; controllo += matricola/100; controllo += matricola/10000; controllo = controllo % 100; return nome+” “+cognome+” “+matricola+”/”+controllo; contatore è presente in una unica copia, matricola esiste per ogni oggetto Ad ogni studente viene assegnata una matricola differente 11/01/2019 Metodi

Classe Studente Cosa manca alla classe Studente: La possibilità di conoscere (non modificare) nome, cognome, matricola La possibilità di memorizzare e conoscere gli esami sostenuti private int numeroEsami=0; private Esame[] esami = new Esame[30]; public addEsame(Esame esame) { esami[numeroEsame++] = esame; } public int esamiSostenuti() { return numeroEsami; Ovviamente dobbiamo avere una classe Esame opportuna 11/01/2019 Metodi

Ereditarieta’ L’ereditarieta’ e’ un meccanismo che consente al programmatore di derivare una nuova classe da una esistente. La classe esistente e’ detta padre o superclasse La classe derivata e’ detta figlia o sottoclasse. La classe figli eredita le caratteristiche della classe padre, cioe’ I metodi e I dati definiti nella superclasse. 11/01/2019 Metodi

Ereditarieta’ Vehicle Car L’ereditarieta’ consente di derivare una versione specializzata dalla classe padre. 11/01/2019 Metodi

Derivare sottoclassi In Java, si usa la parola riservata extends per stabilire una relazione di ereditarieta’. class Car extends Vehicle { // class contents } 11/01/2019 Metodi

Esempio Definire una classe non modificabile in grado di memorizzare un intero Creare e riempire un vettore di 10 oggetti della classe appena definita inizializzati con interi positivi minori di 1000 scelti a caso Stampare i valori memorizzati nel vettore Ordinare il vettore e stampare di nuovo i valori Leggere da tastiera dei dati riguardanti un archivio: Richiedere il numero di dati da leggere Richiedere i dati organizzati per riga: i primi tre caratteri sono cifre decimali e rappresentano il codice del prodotto, segue uno spazio, poi la descrizione del prodotto: (esempio) 123 viti Ordinare i dati per codice e stampare l’archivio così ordinato È possibile utilizzare il programma per elaborare un archivio memorizzato in un file? 11/01/2019 Metodi

public int getCodice() { return codice; public class Dati { private int codice; public Dati(int val) { codice = val; } public int getCodice() { return codice; public String toString() { return String.valueOf(codice); public int cmp(Dati d) { return codice - d.codice; public static void stampaVettore(Dati[] v) { for(int i=0; i<v.length; i++) { System.out.print(" "+v[i]); System.out.println(); 11/01/2019 Metodi

public static void main(String[] args) { Dati[] v = new Dati[10]; for(int i=0; i<v.length; i++) { v[i] = new Dati((int) (Math.random()*1000)); } stampaVettore(v); sort(v); private static void scambia(Dati[]v, int i, int j) { Dati tmp = v[i]; v[i] = v[j]; v[j] = tmp; public static void sort(Dati[] v) { for(int i=0; i<v.length-1; i++) { for(int j=v.length-1; j>i; j--) { if(v[j-1].cmp(v[j])>0) { scambia(v, j, j-1); 11/01/2019 Metodi

public class Prodotti extends Dati { private String descr; public Prodotti(String stringa) { super(Integer.parseInt(stringa.substring(0,3))); descr = stringa.substring(4); } public String toString() { return String.valueOf(getCodice())+' '+descr+'\n'; public static Prodotti[] leggiVettore() { int n = MyUtility.readInt("Quanti prodotti vuoi introdurre? "); Prodotti[] v = new Prodotti[n]; for(int i=0; i<v.length; i++) { v[i] = new Prodotti(MyUtility.readLine("prodotto "+(i+1)+" ")); return v; public static void main(String[] args) { Prodotti[] v = leggiVettore(); stampaVettore(v); sort(v); 11/01/2019 Metodi

Scope dei dati. Lo scope dei dati è la porzione di programma nella quale quei dati possono essere usati (referenziati). I dati definiti a livello di classe possono essere usati da tutti i metodi definiti in quella classe. I dati dichiarati all’interno di un metodo possono essere usati solo in quel metodo. I dati dichiarati all’interno di un metodo sono chiamati dati locali. 11/01/2019 Metodi

Modificatori di visibilità In Java, si realizza l’incapsulamento attraverso l’uso di una serie di modificatori di visibilita’. Un modificatore in Java e’ una parola riservata che specifica caratteristiche particolari di un dato o di un metodo. Si usa il modoficatore final per definire una costante. Java ha tre modificatori di visibilita’: public, private, e protected 11/01/2019 Metodi

Modificatori di visibilità I membri di una classe (dati e metodi) che sono dichiarati public, sono accessibili da qualunque altra classe. I membri dichiarati senza modificatore di visibilita’ hanno una visibilita’ di default e sono accessibili da tutte le classi del medesimo package. Come regola generale, nessun dato dovrebbe essere dichiarato public. I metodi che forniscono servizi accessibili da altre classi devono essere dichiarati public. I metodi pubblici vengono chiamati metodi di servizio o di interfaccia. 11/01/2019 Metodi

Incapsulamento Methods Client Data Un oggetto incapsulato puo’ essere visto come una black box. Il suo funzionamento interno e’ nascosto al cliente, che puo’ solo invocare i metodi di inerfaccia. Methods Client Data 11/01/2019 Metodi

Modificatori di visibilita’   Modificatori di visibilita’ Modificatore Classi o interfacce Metodi e variabili Default (nessun modificatore) Visibili nel proprio package. Ereditati da ogni sottoclasse nello stesso package della loro classe. Accessibili da ogni classe nello stesso package della loro classe. public Visibile ovunque. Ereditati da tutte le sottoclassi. Accessibili ovunque. protected N/A private Non ereditati da alcuna sottoclasse. Non accessibili da nessuna altra classe. 11/01/2019 Metodi  

L’uso di riferimenti a 2 a 2 a a.val=b.val b 3 b 2 b Chiamata scambio tmp=3 a 2 a a 3 a b 3 b b 2 b b.val=tmp tmp=? tmp=3 a 2 a Ritorno da scambio b 3 b tmp=a.val a 3 tmp=3 b 2 11/01/2019 Metodi

L’uso di riferimenti a 2 a 2 a a=b b 3 b b 3 tmp Chiamata scambio a 2 ? tmp tmp a 2 a Ritorno da scambio b 3 b tmp=a a 3 tmp b 2 11/01/2019 Metodi

L’uso di riferimenti vet v vet v a=3 v[a]=v[b] 2 a=3 2 b=1 3 b=1 3 ? tmp tmp vet vet v v a=3 a=3 2 2 tmp=v[a] v[b]=v[a] b=1 3 b=1 3 tmp tmp 11/01/2019 Metodi