+ All Categories
Home > Documents > Uso delle Classi

Uso delle Classi

Date post: 12-Jul-2016
Category:
Upload: gianluca-clementi
View: 243 times
Download: 2 times
Share this document with a friend
Description:
Guida alla creazione e all'utilizzo delle classi in Java
47
Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola Uso di classi 1 Fondamenti di Programmazione Roadmap Roadmap 0. Primi passi con Java 0. Primi passi con Java 1. Buone abitudini 1. Buone abitudini 2. Tipi di dati primitivi 2. Tipi di dati primitivi 3. Uso di classi 3. Uso di classi Fondamenti di Programmazione Uso di classi Uso di classi Le classi, in quanto tipi di dato strutturati, Le classi, in quanto tipi di dato strutturati, prevedono usi e regole più complessi rispetto prevedono usi e regole più complessi rispetto ai tipi semplici ai tipi semplici Abbiamo già visto alcuni aspetti nelle lezioni Abbiamo già visto alcuni aspetti nelle lezioni precedenti, in questa serie di lucidi precedenti, in questa serie di lucidi completiamo e completiamo e sistematizziamo sistematizziamo la trattazione la trattazione Per farlo, esaminiamo l’uso di classi per due Per farlo, esaminiamo l’uso di classi per due problemi molto comuni: l’interazione con problemi molto comuni: l’interazione con l’utente e il trattamento di sequenze di l’utente e il trattamento di sequenze di caratteri caratteri
Transcript
Page 1: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 1

Fondamenti di Programmazione

RoadmapRoadmap

•• 0. Primi passi con Java0. Primi passi con Java

•• 1. Buone abitudini1. Buone abitudini

•• 2. Tipi di dati primitivi2. Tipi di dati primitivi

•• 3. Uso di classi3. Uso di classi

Fondamenti di Programmazione

Uso di classiUso di classi

•• Le classi, in quanto tipi di dato strutturati, Le classi, in quanto tipi di dato strutturati, prevedono usi e regole più complessi rispetto prevedono usi e regole più complessi rispetto ai tipi sempliciai tipi semplici

•• Abbiamo già visto alcuni aspetti nelle lezioni Abbiamo già visto alcuni aspetti nelle lezioni precedenti, in questa serie di lucidi precedenti, in questa serie di lucidi completiamo e completiamo e sistematizziamo sistematizziamo la trattazionela trattazione

•• Per farlo, esaminiamo l’uso di classi per due Per farlo, esaminiamo l’uso di classi per due problemi molto comuni: l’interazione con problemi molto comuni: l’interazione con l’utente e il trattamento di sequenze di l’utente e il trattamento di sequenze di carattericaratteri

Page 2: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 2

Fondamenti di Programmazione

Classi già pronteClassi già pronte

•• Come la maggior parte dei linguaggi di Come la maggior parte dei linguaggi di programmazione, Java è dotato di una libreria programmazione, Java è dotato di una libreria ((librarylibrary) di classi “pronte all’uso” che coprono ) di classi “pronte all’uso” che coprono molte esigenze comuni (e anche meno molte esigenze comuni (e anche meno comuni)comuni)

•• Usare classi già definite da altri è la norma Usare classi già definite da altri è la norma per non sprecare tempo a risolvere problemi per non sprecare tempo a risolvere problemi già risolti o a già risolti o a reinventare reinventare la ruotala ruota

Fondamenti di Programmazione

Uso di una classe prontaUso di una classe pronta

•• Quando si deve cercare e poi usare una Quando si deve cercare e poi usare una classe pronta all’uso i passi da seguire sono:classe pronta all’uso i passi da seguire sono:

Come identificarla ? Dove cercarla ? Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Page 3: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 3

Fondamenti di Programmazione

RoadmapRoadmap

•• 3. Uso di classi3. Uso di classiCome identificarla ? Dove cercarla ? Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Fondamenti di Programmazione

Classi e documentazioneClassi e documentazione

•• La libreria Java standard è accompagnata da La libreria Java standard è accompagnata da documentazione che illustra lo scopo e l’utilizzo di documentazione che illustra lo scopo e l’utilizzo di ciascuna classe presenteciascuna classe presente

•• La documentazione è molto ampia, non ha scopo La documentazione è molto ampia, non ha scopo didattico (non sempre è chiarissima) ma piuttosto di didattico (non sempre è chiarissima) ma piuttosto di ““Reference manualReference manual””

•• Pertanto non è pensabile e non è molto utile studiare Pertanto non è pensabile e non è molto utile studiare estensivamente o memorizzare la documentazione estensivamente o memorizzare la documentazione prima di programmareprima di programmare

•• Al contrario, leggere la documentazione è una delle Al contrario, leggere la documentazione è una delle attività più tipiche durante la programmazioneattività più tipiche durante la programmazione

Page 4: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 4

Fondamenti di Programmazione

Organizzazione delle classiOrganizzazione delle classi

•• La libreria standard segue il metodo di La libreria standard segue il metodo di organizzazione delle classi previsto da Java: le classi organizzazione delle classi previsto da Java: le classi tra loro “affini” sono raggruppate in packagetra loro “affini” sono raggruppate in package

•• Ogni package ha un nome tipicamente composto da Ogni package ha un nome tipicamente composto da due o più parole separate da . e contiene una o più due o più parole separate da . e contiene una o più classi (ed eventualmente altri componenti)classi (ed eventualmente altri componenti)

•• I nomi a più livelli riflettono un’organizzazione I nomi a più livelli riflettono un’organizzazione gerarchica dei package simile a quella delle cartelle gerarchica dei package simile a quella delle cartelle (directory) su un disco(directory) su un disco

Fondamenti di Programmazione

Esempi di packageEsempi di package

java.java.langlang Package fondamentale conPackage fondamentale conclassi di uso molto comuneclassi di uso molto comune

java.iojava.io Package per l’Input/OutputPackage per l’Input/Output

java.java.utilutil Package con classi varie di Package con classi varie di utilità generale utilità generale

java.java.texttext Package con classi per la Package con classi per la gestione ed elaborazione di gestione ed elaborazione di testi e dati in formato testualetesti e dati in formato testuale

Page 5: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 5

Fondamenti di Programmazione

Uso di classi appartenenti Uso di classi appartenenti ad un packagead un package

•• Solo le classi appartenenti al package java.Solo le classi appartenenti al package java.lang lang sono sono automaticamente disponibili in ogni programmaautomaticamente disponibili in ogni programma

•• Per l’uso di altri package in una classe è necessario Per l’uso di altri package in una classe è necessario “importarli” tramite la parola riservata “importarli” tramite la parola riservata importimport

•• Tutte le dichiarazioni di importazione devono trovarsi Tutte le dichiarazioni di importazione devono trovarsi prima della definizione della classeprima della definizione della classe

•• Si possono importare singole classi di un package p.e.Si possono importare singole classi di un package p.e.import java.import java.utilutil..RandomRandomma è più tipico importare comunque tutto il package:ma è più tipico importare comunque tutto il package:import java.import java.utilutil.*.*

Fondamenti di Programmazione

I packageI package

•• All’atto pratico un package è un insieme di file .class All’atto pratico un package è un insieme di file .class tipicamente archiviati in un file compresso .zip o .tipicamente archiviati in un file compresso .zip o .jarjar

•• Ogni classe appartiene ad un package: la Ogni classe appartiene ad un package: la dichiarazione di appartenenza può essere effettuata dichiarazione di appartenenza può essere effettuata all’inizio del codice della classe usando la parola all’inizio del codice della classe usando la parola riservata riservata packagepackage seguita dal nome del packageseguita dal nome del package

•• Se non si dichiara esplicitamente il package la classe Se non si dichiara esplicitamente il package la classe viene assegnata ad un package “anonimo” che viene assegnata ad un package “anonimo” che contiene, oltre ad essa, tutte le classi senza package contiene, oltre ad essa, tutte le classi senza package presenti nella stessa directory presenti nella stessa directory

Page 6: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 6

Fondamenti di Programmazione

RoadmapRoadmap

•• 3. Uso di classi3. Uso di classiCome identificarla ? Dove cercarla ?Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Se è Se è istanziabileistanziabile, come uso le istanze ?, come uso le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Fondamenti di Programmazione

La doppia natura delle classiLa doppia natura delle classi

•• Le classi disponibili nella libreria standard si Le classi disponibili nella libreria standard si possono distinguere in due tipologie principali:possono distinguere in due tipologie principali:

Classi Classi istanziabiliistanziabili

Classi non Classi non istanziabiliistanziabili

•• La stessa distinzione è applicabile alle “nostre” La stessa distinzione è applicabile alle “nostre” classiclassi

Page 7: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 7

Fondamenti di Programmazione

Classi Classi istanziabiliistanziabili

•• Una classe Una classe istanziabile istanziabile fornisce il prototipo di fornisce il prototipo di una famiglia di oggetti (istanze della classe) che una famiglia di oggetti (istanze della classe) che hanno struttura simile ma proprietà distinte a hanno struttura simile ma proprietà distinte a livello individuale (valori diversi degli attributi e livello individuale (valori diversi degli attributi e quindi risultati diversi prodotti dai metodi)quindi risultati diversi prodotti dai metodi)

•• L’uso tipico è la costruzione di istanze (tramite L’uso tipico è la costruzione di istanze (tramite new) e quindi l’invocazione di metodi su di essenew) e quindi l’invocazione di metodi su di esse

•• Esempi: Ossequioso, Valuta, Anno, Esempi: Ossequioso, Valuta, Anno, StringString, . . . , . . .

Fondamenti di Programmazione

Classi non Classi non istanziabiliistanziabili

•• Una classe non Una classe non istanziabile istanziabile contiene un contiene un insieme di metodi (ed eventualmente insieme di metodi (ed eventualmente attributi) di natura generale non legati alle attributi) di natura generale non legati alle proprietà di oggetti individuali specificiproprietà di oggetti individuali specifici

•• Non ha senso la nozione di istanza della Non ha senso la nozione di istanza della classe poiché non ci sono caratteristiche classe poiché non ci sono caratteristiche differenziabili tra oggetti distintidifferenziabili tra oggetti distinti

•• Esempi: Esempi: BuongiornoMainBuongiornoMain, , ValutaDriverValutaDriver, , AnnoDriverAnnoDriver, , MathMath, , CollectionsCollections, . . ., . . .

Page 8: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 8

Fondamenti di Programmazione

Una precisazioneUna precisazione

•• La distinzione tra classi La distinzione tra classi istanziabili istanziabili e non e non istanziabili istanziabili riguarda il senso logico del loro utilizzoriguarda il senso logico del loro utilizzo

•• Il termine “classe non Il termine “classe non istanziabileistanziabile” sarà utilizzato per ” sarà utilizzato per indicare una classe che non ha senso indicare una classe che non ha senso istanziareistanziare, date , date le sue caratteristichele sue caratteristiche

•• Tecnicamente sarebbe possibile usare l’operatore Tecnicamente sarebbe possibile usare l’operatore new su classi “non new su classi “non istanziabiliistanziabili” (composte di metodi ” (composte di metodi e attributi tutti e attributi tutti staticstatic) ma non avrebbe senso pratico) ma non avrebbe senso pratico

•• Vedremo nella parte finale del corso classi di altra Vedremo nella parte finale del corso classi di altra natura (astratte) sulle quali non è tecnicamente natura (astratte) sulle quali non è tecnicamente possibile usare l’operatore newpossibile usare l’operatore new

Fondamenti di Programmazione

Istanziabili Istanziabili vs. non vs. non istanziabiliistanziabili

•• La stragrande maggioranza delle classi è La stragrande maggioranza delle classi è istanziabile istanziabile ma l’esistenza di alcune classi non ma l’esistenza di alcune classi non istanziabili istanziabili è necessariaè necessaria

•• La classe (indispensabile) che contiene il La classe (indispensabile) che contiene il mainmainè normalmente non è normalmente non istanziabileistanziabile

•• Poiché i numeri non sono oggetti, i metodi Poiché i numeri non sono oggetti, i metodi numerici appartengono a classi non numerici appartengono a classi non istanziabiliistanziabili

Page 9: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 9

Fondamenti di Programmazione

Istanziabili Istanziabili vs. non vs. non istanziabiliistanziabili

•• Nel caso di una classe Nel caso di una classe istanziabileistanziabile attributi e metodi attributi e metodi rappresentano proprietà possedute da tutti gli oggetti rappresentano proprietà possedute da tutti gli oggetti istanza della classeistanza della classe

•• Ogni oggetto istanza di una classe ha una sua identità Ogni oggetto istanza di una classe ha una sua identità "contiene" individualmente gli attributi e i metodi "contiene" individualmente gli attributi e i metodi definiti nella classedefiniti nella classe

•• Ogni volta che si costruisce un’istanza con new si crea Ogni volta che si costruisce un’istanza con new si crea un nuovo insieme di attributi e metodi individualiun nuovo insieme di attributi e metodi individuali

•• Nel caso di una classe non Nel caso di una classe non istanziabileistanziabile attributi e attributi e metodi sono “unici” a livello della classe (non esistono metodi sono “unici” a livello della classe (non esistono istanze diversificate)istanze diversificate)

Fondamenti di Programmazione

Classi non Classi non istanziabiliistanziabili

•• Una classe non Una classe non istanziabile istanziabile rappresenta rappresenta “qualcosa” di concettualmente unico, che non “qualcosa” di concettualmente unico, che non esiste e non può esistere in versioni separate esiste e non può esistere in versioni separate ciascuna con una propria identità:ciascuna con una propria identità:–– esiste una sola matematica (la classe esiste una sola matematica (la classe Math Math non è non è

istanziabileistanziabile))

–– esiste un solo sistema su cui un programma è esiste un solo sistema su cui un programma è eseguito (la classe System non è eseguito (la classe System non è istanziabileistanziabile))

–– esiste un solo punto di inizio di un programma (le esiste un solo punto di inizio di un programma (le classi contenenti il classi contenenti il main main non sono non sono istanziabiliistanziabili))

Page 10: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 10

Fondamenti di Programmazione

Riconoscere una classe non Riconoscere una classe non istanziabileistanziabile

•• Non ha costruttoriNon ha costruttori

•• Attributi e metodi sono tutti Attributi e metodi sono tutti staticstatic

•• Quando penso all’esecuzione dei suoi metodi Quando penso all’esecuzione dei suoi metodi non ho bisogno di immaginare un’istanza non ho bisogno di immaginare un’istanza individuale: sono applicabili direttamente alla individuale: sono applicabili direttamente alla classe con almeno un argomento classe con almeno un argomento –– MathMath..sqrtsqrt(2)(2)

–– MathMath..absabs((--3)3)

Fondamenti di Programmazione

In memoria …In memoria …

E

PI

2.7182

Math

public static double abs(double a)

. . .

public static double cos(double a)

. . .

public static double sqrt(doublea)

. . .

public static float ulp(float f)

3.1415

Page 11: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 11

Fondamenti di Programmazione

Classi Classi istanziabiliistanziabili

•• Una classe Una classe istanziabileistanziabile rappresenta “qualcosa” rappresenta “qualcosa” che esiste in molteplici versioni individuali che che esiste in molteplici versioni individuali che hanno una struttura comune ma ciascuna con hanno una struttura comune ma ciascuna con una propria identità:una propria identità:–– esistono molte sequenze di caratteri (la classe esistono molte sequenze di caratteri (la classe

StringString è è istanziabileistanziabile))

–– esistono molte valute (la classe Valuta è esistono molte valute (la classe Valuta è istanziabileistanziabile))

–– esistono molte persone (un’ipotetica classe esistono molte persone (un’ipotetica classe Persona è Persona è istanziabileistanziabile))

Fondamenti di Programmazione

Riconoscere una classe Riconoscere una classe istanziabileistanziabile

•• Ha costruttoriHa costruttori

•• Attributi e metodi sono tutti (o quasi) nonAttributi e metodi sono tutti (o quasi) nonstaticstatic

•• Quando penso all’esecuzione dei suoi metodi Quando penso all’esecuzione dei suoi metodi ho bisogno di immaginare un’istanza ho bisogno di immaginare un’istanza individuale a cui applicarli (anche senza individuale a cui applicarli (anche senza argomenti esterni, perché usano attributi argomenti esterni, perché usano attributi interni)interni)–– Persona.Persona.codiceFiscalecodiceFiscale() // NO! QUALE PERSONA?() // NO! QUALE PERSONA?

–– StringString..toUpperCasetoUpperCase() // NO! QUALE STRINGA?() // NO! QUALE STRINGA?

Page 12: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 12

Fondamenti di Programmazione

In memoria (1) …In memoria (1) …

String nome;

String cognome;

. . .

Persona

public Persona (String _nome, String _cognome)

. . .

public String codiceFiscale()

. . .

Fondamenti di Programmazione

In memoria (2) …In memoria (2) …

String nome;

String cognome;

. . .

Persona

public Persona (String _nome, String _cognome)

. . .

public String codiceFiscale()

. . .

String nome= “Ugo”;

String cognome “Neri”;

. . .

String nome= “Mario”;

String cognome “Rossi”;

. . .

String nome= “Luca”;

String cognome “Verdi”;

. . .

Ogni volta che eseguo new Persona ne creo una nuova istanza distinta

Page 13: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 13

Fondamenti di Programmazione

Due livelli di definizioneDue livelli di definizione

•• Dalla discussione precedente emerge che Dalla discussione precedente emerge che esistono due “livelli” di definizione per esistono due “livelli” di definizione per attributi e metodiattributi e metodi

Nel caso di classi Nel caso di classi istanziabili istanziabili attributi e metodi attributi e metodi sono definiti a livello di istanzasono definiti a livello di istanza

Nel caso di classi non Nel caso di classi non istanziabili istanziabili attributi e attributi e metodi sono definiti a livello di classemetodi sono definiti a livello di classe

Fondamenti di Programmazione

Il modificatore Il modificatore staticstatic

•• La parola riservata La parola riservata static static viene usata per viene usata per indicare il livello di definizione di un attributo indicare il livello di definizione di un attributo o metodoo metodo

•• Se la parola Se la parola static static è presente l’attributo o è presente l’attributo o metodo è definito a livello di classemetodo è definito a livello di classe

•• Se la parola Se la parola static static non è presente l’attributo o non è presente l’attributo o metodo è definito a livello di istanzametodo è definito a livello di istanza

Page 14: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 14

Fondamenti di Programmazione

Il modificatore Il modificatore staticstatic

•• La parola riservata La parola riservata static static viene usata per viene usata per indicare il livello di definizione di un attributo indicare il livello di definizione di un attributo o metodoo metodo

•• Se la parola Se la parola static static è presente l’attributo o è presente l’attributo o metodo è definito a livello di classemetodo è definito a livello di classe

•• Se la parola Se la parola static static non è presente l’attributo o non è presente l’attributo o metodo è definito a livello di istanzametodo è definito a livello di istanza

Il significato del modificatore static non

ha nulla a che vedere con il termine italiano “statico”

Fondamenti di Programmazione

Static Static vs. non vs. non staticstatic•• Ogni attributo o metodo non Ogni attributo o metodo non static static esiste esiste

concretamente in ogni istanza creata concretamente in ogni istanza creata –– Esiste in “molteplici versioni” se vengono create Esiste in “molteplici versioni” se vengono create

più istanzepiù istanze

–– Non esiste concretamente se il programma non Non esiste concretamente se il programma non crea almeno un’istanza (tramite operatore new)crea almeno un’istanza (tramite operatore new)

•• Ogni attributo o metodo Ogni attributo o metodo staticstatic esiste esiste concretamente a livello di classe concretamente a livello di classe –– Esiste in un’unica versioneEsiste in un’unica versione

–– La sua esistenza non dipende da cosa fa il La sua esistenza non dipende da cosa fa il programmaprogramma

Page 15: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 15

Fondamenti di Programmazione

Tirando le sommeTirando le somme

•• Una classe non Una classe non istanziabileistanziabile (come (come MathMath o o BuongiornoMainBuongiornoMain) ) –– non contiene nessun costruttore esplicito non contiene nessun costruttore esplicito

–– dovrebbe contenere solo attributi e metodi dovrebbe contenere solo attributi e metodi staticstatic

•• Una classe Una classe istanziabile istanziabile (come Ossequioso o (come Ossequioso o StringString))–– ha almeno un costruttore (di solito esplicito)ha almeno un costruttore (di solito esplicito)

–– dovrebbe avere almeno un attributo o metodo dovrebbe avere almeno un attributo o metodo non non staticstatic

Fondamenti di Programmazione

Classi Classi istanziabiliistanziabili “ibride”“ibride”

•• Alcune classi Alcune classi istanziabili istanziabili (p.e. (p.e. StringString) della ) della libreria standard contengono attributi o libreria standard contengono attributi o metodi metodi static static ed hanno quindi natura ibridaed hanno quindi natura ibrida

•• E’ come se la classe avesse due sottoparti E’ come se la classe avesse due sottoparti (una (una static static e una no) ognuna delle quali e una no) ognuna delle quali segue le proprie regolesegue le proprie regole

•• Salvo rari casi, è sconsigliabile realizzare Salvo rari casi, è sconsigliabile realizzare classi classi istanziabili istanziabili ibride (sono accettabili ibride (sono accettabili attributi costanti definiti come attributi costanti definiti come staticstatic))

Page 16: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 16

Fondamenti di Programmazione

Proprietà a livello Proprietà a livello di classe e di istanzadi classe e di istanza

attributi non static

attributi static

metodi non static

metodi static

Def. classeProprietà collettive a livello di classe, referenziabili indipendentemente dall'esistenza di istanze

Una classe NON istanziabile “pura” ha solo questa parte

. . .

istanzaN

attributi non static

metodi non static

istanza1

attributi non static

metodi non static

Proprietà individuali: esistono concretamente solo a livello di istanze

Una classe istanziabile “pura” ha solo questa parte

Fondamenti di Programmazione

Accesso a metodi e Accesso a metodi e attributi attributi staticstatic

•• Essendo definiti a livello di classe, attributi e metodi Essendo definiti a livello di classe, attributi e metodi staticstatic sono acceduti/invocati tramite il nome della sono acceduti/invocati tramite il nome della classe: classe:

NomeClasseNomeClasse..nomeMetodoStaticnomeMetodoStatic(...)(...)NomeClasseNomeClasse..nomeAttributoStatic nomeAttributoStatic

P.e.P.e.MathMath..sqrtsqrt(2);(2);StringString..valueOfvalueOf((MathMath.PI);.PI);

•• In caso di classe In caso di classe istanziabileistanziabile ibrida è equivalente, ma ibrida è equivalente, ma sconsigliabile, accedere tramite una qualunque istanza sconsigliabile, accedere tramite una qualunque istanza della classe: della classe:

nomeIstanzanomeIstanza..nomeMetodoStaticnomeMetodoStatic(...)(...)nomeIstanzanomeIstanza..nomeAttributoStatic nomeAttributoStatic

Page 17: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 17

Fondamenti di Programmazione

Accesso a metodi e attributi Accesso a metodi e attributi non non staticstatic

•• La sintassi è simile al caso precedente, ma La sintassi è simile al caso precedente, ma ovviamente l’accesso/invocazione è possibile solo ovviamente l’accesso/invocazione è possibile solo tramite un’istanza specifica (ed ogni accesso è tramite un’istanza specifica (ed ogni accesso è diversificato):diversificato):

nomeIstanzanomeIstanza..nomeMetodoNonStaticnomeMetodoNonStatic(...)(...)nomeIstanzanomeIstanza..nomeAttributoNonStatic nomeAttributoNonStatic

•• P.e.P.e.maggiordomoItamaggiordomoIta.saluta();.saluta();altraValutaaltraValuta..tassoRiftassoRif

Fondamenti di Programmazione

Accesso ad attributi e Accesso ad attributi e metodi della propria classemetodi della propria classe

•• All'interno del corpo di un metodo si possono riferire in All'interno del corpo di un metodo si possono riferire in modo abbreviato attributi e metodi definiti nella stessa modo abbreviato attributi e metodi definiti nella stessa classeclasse

•• Se nel corpo di un metodo appare il nome di un metodo Se nel corpo di un metodo appare il nome di un metodo o attributo o attributo staticstatic della sua classe è sottinteso che sia della sua classe è sottinteso che sia preceduto dal nome della classe stessapreceduto dal nome della classe stessa

•• P.e. nel corpo del metodo P.e. nel corpo del metodo main main di di BuongiornoMainBuongiornoMain

…= new Ossequioso(SALUTO_ITA);…= new Ossequioso(SALUTO_ITA);

…= new Ossequioso(…= new Ossequioso(BuongiornoMainBuongiornoMain.SALUTO_ITA);.SALUTO_ITA);

Forma estesa equivalente

Page 18: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 18

Fondamenti di Programmazione

Accesso ad attributi e Accesso ad attributi e metodi della propria classemetodi della propria classe

•• Se nel corpo di un metodo (non Se nel corpo di un metodo (non staticstatic) appare il nome ) appare il nome di un metodo o attributo non di un metodo o attributo non staticstatic della sua classe è della sua classe è sottinteso che sia riferito all’istanza su cui è stato sottinteso che sia riferito all’istanza su cui è stato invocato il metodoinvocato il metodo

•• P.e. nel corpo del metodo P.e. nel corpo del metodo tassoConversionetassoConversione di Valutadi Valuta

return return tassoRiftassoRif /…/…

si intende l’attributo si intende l’attributo tassoRiftassoRif dell’istanza riferita da dell’istanza riferita da sterlinasterlina se si sta eseguendo l’invocazione se si sta eseguendo l’invocazione sterlina.sterlina.tassoConversionetassoConversione(…)(…) mentre si intende mentre si intende l’attributol’attributo tassoRiftassoRif dell’istanza riferita da dell’istanza riferita da dollarodollaro se se si sta eseguendo si sta eseguendo dollaro.dollaro.tassoConversionetassoConversione(…)(…)

Fondamenti di Programmazione

Incroci vietatiIncroci vietati

•• Nel corpo di un metodo Nel corpo di un metodo staticstatic non si può accedere non si può accedere ad attributi e metodi non ad attributi e metodi non static static della stessa classedella stessa classe

•• Infatti il metodo Infatti il metodo static static deve poter essere invocato a deve poter essere invocato a livello di classe (anche in assenza di istanze) mentre livello di classe (anche in assenza di istanze) mentre attributi e metodi non attributi e metodi non static static esistono solo se c’è esistono solo se c’è almeno un’istanzaalmeno un’istanza

•• Nel corpo di un metodo non Nel corpo di un metodo non static static si può accedere a si può accedere a qualunque attributo e metodo della stessa classe (se qualunque attributo e metodo della stessa classe (se esiste l’istanza ovviamente esiste la classe)esiste l’istanza ovviamente esiste la classe)

Page 19: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 19

Fondamenti di Programmazione

Errori subdoliErrori subdoli

•• Eventuali mescolanze improprie di Eventuali mescolanze improprie di static static e e non non static static causano errori di compilazionecausano errori di compilazione

•• Si può “accontentare” il compilatore facendo Si può “accontentare” il compilatore facendo grossi errori concettuali (p.e. aggiungendo grossi errori concettuali (p.e. aggiungendo staticstatic dove non deve stare)dove non deve stare)

•• Modificare il codice per accontentare il Modificare il codice per accontentare il compilatore senza pensare al significato della compilatore senza pensare al significato della modifica può solo peggiorare le cosemodifica può solo peggiorare le cose

Fondamenti di Programmazione

Errori subdoliErrori subdoli

NON modificare MAI il codice per

accontentare il compilatore senza pensare al significato

della modifica

Page 20: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 20

Fondamenti di Programmazione

Errori subdoliErrori subdoli

L’uso improprio del modificatore static

causa errori DISASTROSItalvolta ritenuti MISTERIOSI

Fondamenti di Programmazione

Errori subdoliErrori subdoli

public class Valutapublic class Valuta{{private private StringString nome;nome;

private private double tassoRifdouble tassoRif;;

public Valuta(public Valuta(StringString _nome, _nome, doubledouble __tassoRiftassoRif)){{nome = _nome;nome = _nome;tassoRiftassoRif = _= _tassoRiftassoRif;;

}}

public public static double tassoConversionestatic double tassoConversione (Valuta (Valuta altraValutaaltraValuta)){{return return tassoRiftassoRif//altraValutaaltraValuta..tassoRiftassoRif;;}}

}}

Si intrufola uno static di troppo per distrazione o come residuo di un copia/incolla

staticstaticSi aggiunge static per compilare

Page 21: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 21

Fondamenti di Programmazione

Il “driver” non cambia . . .Il “driver” non cambia . . .

public class public class ValutaDriverValutaDriver{{public public static void main static void main ((String args String args [])[]){{Valuta sterlina = new Valuta("Sterlina",1.40);Valuta sterlina = new Valuta("Sterlina",1.40);Valuta dollaro = new Valuta("Dollaro",0.67);Valuta dollaro = new Valuta("Dollaro",0.67);Valuta franco = new Valuta("Franco Svizzero",0.60);Valuta franco = new Valuta("Franco Svizzero",0.60);System.out.System.out.printprint("Risultato 1 = ");("Risultato 1 = ");System.out.System.out.printlnprintln(sterlina.(sterlina.tassoConversionetassoConversione(dollaro));(dollaro));System.out.System.out.printprint("Risultato 2 = ");("Risultato 2 = ");System.out.System.out.printlnprintln(dollaro.(dollaro.tassoConversionetassoConversione(sterlina));(sterlina));System.out.System.out.printprint("Risultato 3 = ");("Risultato 3 = ");System.out.System.out.printlnprintln(dollaro.(dollaro.tassoConversionetassoConversione(franco));(franco));}}

}}

Fondamenti di Programmazione

. . . ma il risultato sì !. . . ma il risultato sì !

Page 22: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 22

Fondamenti di Programmazione

RoadmapRoadmap

•• 3. Uso di classi3. Uso di classiCome identificarla ? Dove cercarla ?Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Se è Se è istanziabileistanziabile, come uso le istanze ?, come uso le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Fondamenti di Programmazione

Due esempi Due esempi

•• Come primi esempi di classi pronte Come primi esempi di classi pronte istanziabiliistanziabiliuseremo le classi useremo le classi String String e e StringBuffer StringBuffer del package del package java.java.langlang

•• La classe La classe String String ha lo scopo di rappresentare ha lo scopo di rappresentare stringhe (sequenze) di caratteri che non devono stringhe (sequenze) di caratteri che non devono essere modificate dopo essere state costruite essere modificate dopo essere state costruite (oggetti immutabili)(oggetti immutabili)

•• La classe La classe StringBuffer StringBuffer ha lo scopo di rappresentare ha lo scopo di rappresentare stringhe (sequenze) di caratteri che possono essere stringhe (sequenze) di caratteri che possono essere modificate dopo essere state costruite (in Java 6 c’è modificate dopo essere state costruite (in Java 6 c’è anche una classe molto simile di nome anche una classe molto simile di nome StringBuilderStringBuilder))

Page 23: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 23

Fondamenti di Programmazione

Definizione di variabiliDefinizione di variabili•• tipo nome; tipo nome; oppureoppuretipo nome1,...,tipo nome1,...,nomeNnomeN;;String nome;StringBuffer risultato;Ossequioso maggiordomoIta, maggiordomoFra;

nullnome

nome non è un oggetto di tipo String è solo un riferimento utilizzabile per accedere ad un oggetto String

Dopo la definizione esiste solo il riferimento, non un oggetto di tipo String !Il valore speciale null è il valoreiniziale di default per qualunque variabile di tipo strutturato.Esso indica che il riferimento è nullo e non c'e' nessun oggetto riferito

Fondamenti di Programmazione

Operatore newOperatore new

•• L'operatore L'operatore new new NomeClasseNomeClasse crea un nuovo oggetto crea un nuovo oggetto con le proprietà definite in con le proprietà definite in NomeClasseNomeClasse (istanza della (istanza della classe) e ritorna il riferimento ad essoclasse) e ritorna il riferimento ad esso

•• L'operatore L'operatore newnew dà luogo all’invocazione di un metodo dà luogo all’invocazione di un metodo costruttore passandogli gli argomenti necessaricostruttore passandogli gli argomenti necessari

•• Il costruttore invocato deve essere di una classe Il costruttore invocato deve essere di una classe uguale o "compatibile" con la definizione della variabileuguale o "compatibile" con la definizione della variabile

•• Ogni classe può avere più costruttori che si Ogni classe può avere più costruttori che si differenziano per la lista degli argomentidifferenziano per la lista degli argomenti

Page 24: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 24

Fondamenti di Programmazione

CostruttoriCostruttori

•• La classe La classe String String ha 15 costruttori alternativi in Java 6 ha 15 costruttori alternativi in Java 6 (erano 11 in Java 2)(erano 11 in Java 2)

•• La classe La classe StringBuffer StringBuffer ha 4 costruttori alternativi in ha 4 costruttori alternativi in Java 6 (erano 3 in Java 2)Java 6 (erano 3 in Java 2)

•• La scelta del costruttore da invocare avviene tramite La scelta del costruttore da invocare avviene tramite gli argomenti attuali che vengono passatigli argomenti attuali che vengono passati

•• Il modo più tipico di costruire un oggetto Il modo più tipico di costruire un oggetto String String o o StringBufferStringBuffer è quello di passargli una sequenza di è quello di passargli una sequenza di caratteri tra doppie virgolette (che di fatto è un caratteri tra doppie virgolette (che di fatto è un oggetto oggetto String String creato automaticamente)creato automaticamente)

Fondamenti di Programmazione

saluto = new String("Ciao ciao");

New di un oggetto New di un oggetto StringString

nullsalutoCiao ciao

String saluto;

Page 25: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 25

Fondamenti di Programmazione

Varianti sul temaVarianti sul tema

•• L'operatore L'operatore new new può essere usato al può essere usato al momento della definizionemomento della definizione

String saluto = new String("Ciao ciao");StringBuffer salutino = new StringBuffer("Bye");StringBuffer saluto2 = new StringBuffer(saluto);

•• Solo per la classe Solo per la classe StringString, in quanto di uso , in quanto di uso molto comune, Java offre la forma compattamolto comune, Java offre la forma compatta

String s = "Ciao ciao";

Fondamenti di Programmazione

Costruzioni diverseCostruzioni diverse

String saluto = new String("Ciao ciao");

StringBuffer salutino = new StringBuffer("Bye");

StringBuffer saluto2 = new StringBuffer(saluto);

saluto

Ciao ciao

metodi classeString

salutino

Bye

metodi classeStringBuffer

saluto2

Ciao ciao

metodi classeStringBuffer

Page 26: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 26

Fondamenti di Programmazione

RoadmapRoadmap

•• 3. Uso di classi3. Uso di classiCome identificarla ? Dove cercarla ?Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Se è Se è istanziabileistanziabile, cosa posso fare con le istanze ?, cosa posso fare con le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Fondamenti di Programmazione

Operazioni su istanzeOperazioni su istanze

•• Le principali operazioni che si possono Le principali operazioni che si possono effettuare sulle variabili che riferiscono effettuare sulle variabili che riferiscono istanze di una classe sono: istanze di una classe sono:

assegnamentoassegnamento

confrontoconfronto

invocazione di metodiinvocazione di metodi

Page 27: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 27

Fondamenti di Programmazione

Operazioni su istanzeOperazioni su istanze

•• Le principali operazioni che si possono Le principali operazioni che si possono effettuare sulle variabili che riferiscono effettuare sulle variabili che riferiscono istanze di una classe sono: istanze di una classe sono:

assegnamentoassegnamento

confrontoconfronto

invocazione di metodiinvocazione di metodi

Fondamenti di Programmazione

Assegnamenti tra variabili di Assegnamenti tra variabili di tipi strutturatitipi strutturati

String saluto1, saluto2, saluto3;

saluto1 = new String("Ciao ciao");

saluto2 = new String("Buongiorno");

...

saluto2=saluto1;

saluto1=saluto3;

saluto1 Ciao ciao

metodi classe

String

saluto2 Buongiorno

metodi classe

Stringnullsaluto3

null

Buongiorno

metodi classe

String

Page 28: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 28

Fondamenti di Programmazione

Assegnamenti tra Assegnamenti tra variabili di tipi strutturativariabili di tipi strutturati

v1 = v2;

v2

PRIMA DOPO

v1

null

v2

null

v1

null

v2

null

v1

null

v2

v1

Fondamenti di Programmazione

Assegnamenti tra variabili di Assegnamenti tra variabili di tipi strutturatitipi strutturati

v1 = v2;PRIMA DOPO

v1

v2

null

v2

null

v1

null

v1

v2

v1

v2

Page 29: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 29

Fondamenti di Programmazione

Il valore è il riferimento !Il valore è il riferimento !

•• Il valore di una variabile di tipo strutturato è il Il valore di una variabile di tipo strutturato è il riferimento ad un oggetto (istanza di una riferimento ad un oggetto (istanza di una classe)classe)

•• Una stessa variabile può riferire oggetti Una stessa variabile può riferire oggetti diversi in momenti diversi a seguito di diversi in momenti diversi a seguito di operazioni di assegnazione sul suo valoreoperazioni di assegnazione sul suo valore

•• Se la variabile contiene il valore Se la variabile contiene il valore nullnull non non riferisce nessun oggetto in quel momentoriferisce nessun oggetto in quel momento

Fondamenti di Programmazione

Oggetti e riferimentiOggetti e riferimenti•• Le variabili hanno un nome, gli oggetti noLe variabili hanno un nome, gli oggetti no

•• Per utilizzare un oggetto bisogna passare attraverso Per utilizzare un oggetto bisogna passare attraverso una variabile che ne contiene il riferimentouna variabile che ne contiene il riferimento

•• Uno stesso oggetto può essere riferito da più variabili e Uno stesso oggetto può essere riferito da più variabili e quindi essere raggiunto tramite nomi diversi (di quindi essere raggiunto tramite nomi diversi (di variabili)variabili)

•• Il rapporto variabiliIl rapporto variabili--oggetti riferiti è dinamico, il oggetti riferiti è dinamico, il riferimento iniziale non necessariamente rimane legato riferimento iniziale non necessariamente rimane legato all’oggetto per tutta la sua esistenzaall’oggetto per tutta la sua esistenza

•• Se un oggetto non è (più) riferito da nessuna variabile Se un oggetto non è (più) riferito da nessuna variabile diventa irraggiungibile (e quindi inutilizzabile)diventa irraggiungibile (e quindi inutilizzabile)

Page 30: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 30

Fondamenti di Programmazione

Operazioni su istanzeOperazioni su istanze

•• Le principali operazioni che si possono Le principali operazioni che si possono effettuare sulle variabili che riferiscono effettuare sulle variabili che riferiscono istanze di una classe sono: istanze di una classe sono:

assegnamentoassegnamento

confrontoconfronto

invocazione di metodiinvocazione di metodi

Fondamenti di Programmazione

Confronti tra variabili di tipo Confronti tra variabili di tipo strutturatostrutturato

•• E’ possibile applicare gli operatori di confronto E’ possibile applicare gli operatori di confronto ==== e e != != a variabili di tipo strutturatoa variabili di tipo strutturato

•• Se uno dei due termini del confronto è il valore Se uno dei due termini del confronto è il valore nullnullsi verifica se una certa variabile riferisce un oggetto si verifica se una certa variabile riferisce un oggetto oppure no, oppure no, p.e. p.e. saluto3 != saluto3 != nullnull

•• Se entrambi i termini del confronto sono variabili, si Se entrambi i termini del confronto sono variabili, si verifica se hanno lo stesso valore (cioè riferiscono verifica se hanno lo stesso valore (cioè riferiscono esattamente lo stesso oggetto)esattamente lo stesso oggetto)

•• Raramente questo è desiderato e utileRaramente questo è desiderato e utile

Page 31: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 31

Fondamenti di Programmazione

Il valore è il riferimento !Il valore è il riferimento !

saluto1 == saluto2 saluto1 == saluto2 ????FALSE

StringString saluto1 = new saluto1 = new StringString ("Buongiorno");("Buongiorno");

StringString saluto2 = new saluto2 = new StringString ("Buongiorno");("Buongiorno");

saluto1

Buongiorno

metodi classeString

saluto2

Buongiorno

metodi classeString

Fondamenti di Programmazione

Il valore è il riferimento !Il valore è il riferimento !

saluto1 == saluto2 saluto1 == saluto2 ????TRUE

StringString saluto1 = new saluto1 = new StringString ("Buongiorno");("Buongiorno");

StringString saluto2 = saluto1saluto2 = saluto1

saluto1

Buongiorno

metodi classeString

saluto2

Page 32: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 32

Fondamenti di Programmazione

Confronto tra riferimenti vs. Confronto tra riferimenti vs. confronto tra oggetticonfronto tra oggetti

•• Usare == fa il confronto tra i riferimenti non fra i Usare == fa il confronto tra i riferimenti non fra i valori contenuti negli oggetti (p.e. le sequenze di valori contenuti negli oggetti (p.e. le sequenze di caratteri contenute nelle istanze di caratteri contenute nelle istanze di StringString))

•• Di solito si vogliono confrontare i contenuti non i Di solito si vogliono confrontare i contenuti non i riferimenti: per questo si usa il metodo riferimenti: per questo si usa il metodo equals equals

•• Il metodo Il metodo booleano equalsbooleano equals della classe della classe StringString accetta accetta come argomento il riferimento ad un altro oggetto e come argomento il riferimento ad un altro oggetto e ritorna ritorna truetrue se le stringhe contenute sono uguali (in se le stringhe contenute sono uguali (in modo case sensitive), false altrimentimodo case sensitive), false altrimenti

•• Il metodo Il metodo booleano equalsIgnoreCasebooleano equalsIgnoreCase fa lo stesso fa lo stesso senza distinguere maiuscole/minuscolesenza distinguere maiuscole/minuscole

Fondamenti di Programmazione

ConfrontoConfrontoStringString saluto1 = new saluto1 = new StringString ("Buongiorno");("Buongiorno");

StringString saluto2 = new saluto2 = new StringString ("Buongiorno");("Buongiorno");

saluto1 == saluto2; // falsesaluto1 == saluto2; // false

saluto1.saluto1.equalsequals(saluto2); // (saluto2); // truetrue

saluto1

Buongiorno

metodi classeString

saluto2

Buongiorno

metodi classeString

Page 33: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 33

Fondamenti di Programmazione

ConfrontoConfrontoStringString saluto1 = new saluto1 = new StringString ("Buongiorno");("Buongiorno");

StringString saluto2 = new saluto2 = new StringString ("buongiorno");("buongiorno");

saluto1 == saluto2; // falsesaluto1 == saluto2; // false

saluto1.saluto1.equalsequals(saluto2); // false(saluto2); // false

saluto1.saluto1.equalsIgnoreCaseequalsIgnoreCase(saluto2); // (saluto2); // truetrue

saluto1

Buongiorno

metodi classeString

saluto2

buongiorno

metodi classeString

Fondamenti di Programmazione

Una particolarità di Una particolarità di StringString

•• Usare esplicitamente new oppure la forma Usare esplicitamente new oppure la forma abbreviata per abbreviata per inizializzare inizializzare un oggetto un oggetto String String non è esattamente la stessa cosanon è esattamente la stessa cosa

•• Se si usa esplicitamente new, la Java Se si usa esplicitamente new, la Java Virtual Virtual MachineMachine crea oggetti distinti anche se di crea oggetti distinti anche se di contenuto ugualecontenuto uguale

•• Se non si usa esplicitamente new, la Java Se non si usa esplicitamente new, la Java Virtual Machine Virtual Machine evita di creare oggetti distinti evita di creare oggetti distinti ma dal contenuto ugualema dal contenuto uguale

Page 34: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 34

Fondamenti di Programmazione

Una particolarità di Una particolarità di StringString

StringString saluto1 = new saluto1 = new StringString ("Buongiorno");("Buongiorno");

StringString saluto2 = new saluto2 = new StringString ("Buongiorno");("Buongiorno");

saluto1

Buongiorno

metodi classeString

saluto2

Buongiorno

metodi classeString

Fondamenti di Programmazione

Una particolarità di Una particolarità di StringString

StringString saluto1 = "Buongiorno";saluto1 = "Buongiorno";

StringString saluto2 = "Buongiorno";saluto2 = "Buongiorno";

saluto1

Buongiorno

metodi classeString

saluto2

Page 35: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 35

Fondamenti di Programmazione

Alcune distinzioniAlcune distinzioni

a = "b";

a è una variabile di tipo StringIl riferimento ad un oggetto che contiene una stringa composta dal solo carattere bviene copiato “dentro” a

a

"b"

Fondamenti di Programmazione

Alcune distinzioniAlcune distinzioni

a = 'b';

a è una variabile di tipo charIl valore corrispondente al singolo carattere b viene copiato “dentro” a

a‘b’

Page 36: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 36

Fondamenti di Programmazione

Alcune distinzioniAlcune distinzioni

a = ' ';

a è una variabile di tipo charIl valore corrispondente al singolo carattere spazio(invisibile, detto anche blank) viene copiato “dentro” a

a‘ ’

Fondamenti di Programmazione

Alcune distinzioniAlcune distinzioni

a = " ";

a è una variabile di tipo StringIl riferimento ad un oggetto che contiene una stringa composta dal solo carattere spazio viene copiato “dentro” a

a

" "

Page 37: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 37

Fondamenti di Programmazione

Alcune distinzioniAlcune distinzionia = "";

a è una variabile di tipo StringIl riferimento ad un oggetto che contiene una stringa vuotacomposta da nessun carattereviene copiato “dentro” aNon confondere stringa vuota (detta anche nulla) con riferimento null

a

""

Fondamenti di Programmazione

Operazioni su istanzeOperazioni su istanze

•• Le principali operazioni che si possono Le principali operazioni che si possono effettuare sulle variabili che riferiscono effettuare sulle variabili che riferiscono istanze di una classe sono: istanze di una classe sono:

assegnamentoassegnamento

confrontoconfronto

invocazione di metodiinvocazione di metodi

Page 38: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 38

Fondamenti di Programmazione

MetodiMetodi

•• I metodi non I metodi non staticstatic rappresentano operazioni rappresentano operazioni effettuabili su singoli oggettieffettuabili su singoli oggetti

•• La documentazione indica per ogni metodo il La documentazione indica per ogni metodo il tipo ritornato e la lista degli argomenti formali tipo ritornato e la lista degli argomenti formali che rappresentano i dati che il metodo deve che rappresentano i dati che il metodo deve ricevere in ingresso da chi lo invocaricevere in ingresso da chi lo invoca

•• Per ogni argomento formale sono specificati:Per ogni argomento formale sono specificati:–– un nomeun nome

–– un tipoun tipo

Fondamenti di Programmazione

Esempi di metodi di Esempi di metodi di StringString

public public char charAt char charAt ((int indexint index))

ReturnsReturns the the charactercharacter at the at the specified indexspecified index. . An index ranges fromAn index ranges from 0 0 to to lengthlength() () -- 1.1.

public public String substring String substring ((int beginIndexint beginIndex, , int endIndexint endIndex))

ReturnsReturns a new a new string that isstring that is a a substringsubstring of of thisthis string. The string. The substring substring beginsbegins at the at the specified beginIndexspecified beginIndex and and extends toextends to the the charactercharacter at at index endIndexindex endIndex -- 1. 1. ThusThus the the lengthlength of the of the substring is endIndexsubstring is endIndex--beginIndexbeginIndex. .

Tipo ritornato Nome del metodo Lista argomenti attuali (uno solo in questo caso)

Tipo ritornato Nome del metodoLista argomenti attuali (due in questo caso)

Page 39: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 39

Fondamenti di Programmazione

Esempi di metodi di Esempi di metodi di StringString

public public int int length length ()()

ReturnsReturns the the lengthlength of of thisthis string. The string. The length is equal tolength is equal to the the numbernumberof 16of 16--bit bit Unicode charactersUnicode characters in the string.in the string.

public public String toUpperCase String toUpperCase ()()

Converts allConverts all of the of the characterscharacters in in this String tothis String to upper case upper case usingusing the the rulesrulesof the of the defaultdefault locale. locale.

Tipo ritornato Nome del metodoLista argomenti attuali (nessuno in questo caso)

Tipo ritornato Nome del metodoLista argomenti attuali (nessuno in questo caso)

N.B. Il metodo N.B. Il metodo toUpperCase toUpperCase (così come il metodo (così come il metodo corrispondente corrispondente toLowerCasetoLowerCase) restituisce un riferimento ad un ) restituisce un riferimento ad un nuovo oggetto nuovo oggetto StringString: quello iniziale rimane immutato !: quello iniziale rimane immutato !

Fondamenti di Programmazione

Concatenazione di stringheConcatenazione di stringhe

•• L'operatore + si applica a due (o più) variabili L'operatore + si applica a due (o più) variabili di tipo di tipo StringString (o meglio: almeno una (o meglio: almeno una StringStringe altre trasformabili in e altre trasformabili in StringString))

•• Il risultato è un nuovo oggetto Il risultato è un nuovo oggetto StringString il cui il cui contenuto è la sequenza di caratteri risultante contenuto è la sequenza di caratteri risultante dalla concatenazione delle sequenze dalla concatenazione delle sequenze corrispondenti alle variabili coinvoltecorrispondenti alle variabili coinvolte

int int estratto = . . . ;estratto = . . . ;

System.out.System.out.printlnprintln("Il numero vincente e'" + estratto);("Il numero vincente e'" + estratto);

Page 40: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 40

Fondamenti di Programmazione

Esempi di metodi di Esempi di metodi di StringBufferStringBuffer

public public StringBuffer appendStringBuffer append((String strString str))AppendsAppends the the string to this stringstring to this string buffer. buffer.

public public StringBuffer insertStringBuffer insert((intint offset, offset, String strString str))InsertsInserts the the string into this stringstring into this string buffer. buffer.

public public StringBuffer deleteCharAtStringBuffer deleteCharAt((int indexint index))RemovesRemoves the the charactercharacter at the at the specifiedspecified position in position in this StringBufferthis StringBuffer((shorteningshortening the the StringBuffer byStringBuffer by one one charactercharacter).).

public public StringBuffer reverseStringBuffer reverse()The ()The character sequence containedcharacter sequence contained in in this this stringstring buffer buffer is replaced byis replaced by the the reversereverse of the of the sequencesequence. .

N.B. I metodi della classe N.B. I metodi della classe StringBuffer StringBuffer normalmente normalmente modificano il contenuto dell’oggetto su cui sono invocati e modificano il contenuto dell’oggetto su cui sono invocati e restituiscono un riferimento all’oggetto stesso (anziché ad uno restituiscono un riferimento all’oggetto stesso (anziché ad uno nuovo, come normalmente fanno i metodi della classe nuovo, come normalmente fanno i metodi della classe StringString))

Fondamenti di Programmazione

Invocazione di metodiInvocazione di metodi

•• L’invocazione di un metodo non L’invocazione di un metodo non static static su un su un oggetto istanza della classe in cui il metodo è oggetto istanza della classe in cui il metodo è definito si effettua con la sintassi:definito si effettua con la sintassi:

nomeVarnomeVar..nomeMetodonomeMetodo(lista argomenti attuali)(lista argomenti attuali)

Page 41: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 41

Fondamenti di Programmazione

Argomenti attuali e formaliArgomenti attuali e formali

•• Ogni volta che si invoca un metodo si deve Ogni volta che si invoca un metodo si deve specificare una lista di argomenti attualispecificare una lista di argomenti attuali

•• Gli argomenti attualiGli argomenti attuali e e formali sonoformali sono in in corrispondenza posizionale corrispondenza posizionale

•• Gli argomenti attuali possono essere delle Gli argomenti attuali possono essere delle variabilivariabili o o delle espressionidelle espressioni

•• Gli argomenti attuali devono rispettare il tipo Gli argomenti attuali devono rispettare il tipo attribuito agli argomenti formaliattribuito agli argomenti formali

Fondamenti di Programmazione

Un saluto maiuscoloUn saluto maiuscolo

public class Ossequiosopublic class Ossequioso{{private private String mioSalutoString mioSaluto;;

public Ossequioso (public Ossequioso (String cosaDevoDireString cosaDevoDire)){{mioSalutomioSaluto = = cosaDevoDirecosaDevoDire;;} } . . .. . .public public voidvoid salutaUppersalutaUpper () () {{

System.out.System.out.printlnprintln((mioSalutomioSaluto..toUppercasetoUppercase()); ()); }}

} }

Page 42: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 42

Fondamenti di Programmazione

Un saluto a rovescioUn saluto a rovescio

public class Ossequiosopublic class Ossequioso{{private private String mioSalutoString mioSaluto;;

public Ossequioso (public Ossequioso (String cosaDevoDireString cosaDevoDire)){{mioSalutomioSaluto = = cosaDevoDirecosaDevoDire;;} } . . .. . .public public void salutaRovesciovoid salutaRovescio () () {{StringBuffer StringBuffer rovescio = new rovescio = new StringBufferStringBuffer((mioSalutomioSaluto););rovescio.rovescio.reversereverse();();System.out.System.out.printlnprintln(rovescio); (rovescio); }}

} }

Fondamenti di Programmazione

RoadmapRoadmap

•• 3. Uso di classi3. Uso di classiCome identificarla ? Dove cercarla ?Come identificarla ? Dove cercarla ?

La classe è La classe è istanziabile istanziabile o non o non istanziabile istanziabile ??

Se è Se è istanziabileistanziabile, come creo le istanze ?, come creo le istanze ?

Se è Se è istanziabileistanziabile, cosa posso fare con le istanze ?, cosa posso fare con le istanze ?

Quali metodi mi servono e come li uso ?Quali metodi mi servono e come li uso ?

Page 43: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 43

Fondamenti di Programmazione

Lunghi elenchiLunghi elenchi

•• La documentazione di ogni classe (La documentazione di ogni classe (istanziabileistanziabile o o no) contiene l’elenco dei metodi disponibilino) contiene l’elenco dei metodi disponibili

•• La classe La classe MathMath non è non è istanziabileistanziabile e contiene 54 e contiene 54 metodi (tutti metodi (tutti static static ovviamente)ovviamente)

•• La classe La classe StringString è “è “istanziabile istanziabile ibrida” e contiene ibrida” e contiene 70 metodi di cui 13 70 metodi di cui 13 staticstatic

•• La classe La classe StringBufferStringBuffer è “è “istanziabileistanziabile pura” e pura” e contiene 53 metodi (nessuno contiene 53 metodi (nessuno static static ovviamente)ovviamente)

Fondamenti di Programmazione

La ricerca del metodoLa ricerca del metodo

•• Capire se esistono una classe e/o un metodo Capire se esistono una classe e/o un metodo che fanno ciò che ci serve non è sempre che fanno ciò che ci serve non è sempre facile: esiste un mare di classi ognuna delle facile: esiste un mare di classi ognuna delle quali può contenere decine di metodiquali può contenere decine di metodi

•• I libri, gli esempi già fatti, i programmatori più I libri, gli esempi già fatti, i programmatori più esperti possono essere indispensabili per esperti possono essere indispensabili per indirizzare la ricercaindirizzare la ricerca

•• In subordine, può essere utile anche la ricerca In subordine, può essere utile anche la ricerca su Internetsu Internet

Page 44: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 44

Fondamenti di Programmazione

La ricerca del metodoLa ricerca del metodo

•• Se nessuno ci indirizza e nemmeno Internet ci Se nessuno ci indirizza e nemmeno Internet ci aiuta si procede per tentativi seguendo aiuta si procede per tentativi seguendo l’ordine logico:l’ordine logico:–– individuare il packageindividuare il package

–– individuare la classeindividuare la classe

–– individuare il metodoindividuare il metodo

•• I nomi delle classi e dei metodi ci dovrebbero I nomi delle classi e dei metodi ci dovrebbero aiutareaiutare

Fondamenti di Programmazione

Esempio di ricercaEsempio di ricerca

•• Supponiamo di voler arrotondare un numero Supponiamo di voler arrotondare un numero floatingfloating pointpoint all’intero più vicino: ci sarà un all’intero più vicino: ci sarà un metodo che lo fa per noi ?metodo che lo fa per noi ?

•• Essendo un’operazione matematica Essendo un’operazione matematica fondamentale la ricerca si orienta sul package fondamentale la ricerca si orienta sul package java.java.lang lang e sulla classe e sulla classe MathMath

•• Sapendo che in inglese round significa Sapendo che in inglese round significa (anche) arrotondare vediamo se c’è un (anche) arrotondare vediamo se c’è un metodo con questo nomemetodo con questo nome

Page 45: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 45

Fondamenti di Programmazione

Overloading Overloading di metodidi metodi

•• Esistono due metodi round nella classe Esistono due metodi round nella classe MathMath

•• I due metodi hanno lo stesso nome ma sono I due metodi hanno lo stesso nome ma sono distinguibili in base alla lista degli argomenti: uno distinguibili in base alla lista degli argomenti: uno riceve in ingresso un argomento riceve in ingresso un argomento floatfloat, l’altro riceve in , l’altro riceve in ingresso un argomento ingresso un argomento doubledouble

•• La definizione di metodi con lo stesso nome ma liste La definizione di metodi con lo stesso nome ma liste degli argomenti diverse, cioè varianti diverse dello degli argomenti diverse, cioè varianti diverse dello stesso metodo è detta stesso metodo è detta overloadingoverloading

•• A seconda degli argomenti passati verrà selezionato A seconda degli argomenti passati verrà selezionato ed eseguito il metodo appropriatoed eseguito il metodo appropriato

Fondamenti di Programmazione

Esempi di Esempi di overloadingoverloading

•• Nella classe Nella classe Math Math i metodi i metodi absabs, , maxmax e e minminsono definiti ciascuno in 4 versioni diversesono definiti ciascuno in 4 versioni diverse

•• Nella classe Nella classe String String il metodo il metodo substringsubstring è è definito in 2 versioni diversedefinito in 2 versioni diverse

•• Nella classe Nella classe StringBuffer StringBuffer il metodo il metodo append append è è definito in 13 versioni diversedefinito in 13 versioni diverse

•• Se una classe Se una classe istanziabile istanziabile ha più costruttori ha più costruttori essi sono (ovviamente) in essi sono (ovviamente) in overloading overloading

Page 46: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 46

Fondamenti di Programmazione

Altro esempio di ricercaAltro esempio di ricerca

•• Supponiamo di voler verificare se una Supponiamo di voler verificare se una sequenza di caratteri ne contiene uno in sequenza di caratteri ne contiene uno in particolare: ci sarà un metodo che lo fa per particolare: ci sarà un metodo che lo fa per noi ?noi ?

•• Essendo un’operazione fondamentale sui Essendo un’operazione fondamentale sui caratteri la ricerca si orienta sul package caratteri la ricerca si orienta sul package java.java.lang lang e sulle classi e sulle classi String String o o StringBufferStringBuffer

•• Stavolta non è facile ipotizzare un nome di Stavolta non è facile ipotizzare un nome di metodo, scorriamo la lista . . .metodo, scorriamo la lista . . .

Fondamenti di Programmazione

ComplicazioniComplicazioni

•• Il metodo Il metodo contains contains sembra essere quello che sembra essere quello che ci serve (in effetti lo è) ma richiede ci serve (in effetti lo è) ma richiede conoscenze che non abbiamo ancoraconoscenze che non abbiamo ancora

•• Peraltro il metodo Peraltro il metodo contains contains non esisteva fino non esisteva fino alla versione 1.4alla versione 1.4

•• Il metodo Il metodo indexOf indexOf (in 4 versioni) non fa (in 4 versioni) non fa esattamente quello che ci serve ma quasi . . .esattamente quello che ci serve ma quasi . . .

Page 47: Uso delle Classi

Modulo di Fondamenti di Programmazione P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi 47

Fondamenti di Programmazione

Uso “creativo” dei metodiUso “creativo” dei metodi

•• Il metodo Il metodo indexOf indexOf (nella versione che riceve (nella versione che riceve in ingresso un in ingresso un charchar) restituisce la posizione ) restituisce la posizione della prima occorrenza nella stringa del della prima occorrenza nella stringa del char char specificatospecificato

•• Se nella stringa il Se nella stringa il char char non c’è, restituisce non c’è, restituisce --11

•• Quindi possiamo sapere se il Quindi possiamo sapere se il char char è presente è presente o meno distinguendo tra risultati non negativi o meno distinguendo tra risultati non negativi e il risultato e il risultato --11

Fondamenti di Programmazione

Ricerche senza successoRicerche senza successo

•• Ci interessa un metodo che calcoli il logaritmo Ci interessa un metodo che calcoli il logaritmo in base 2 di un numeroin base 2 di un numero

•• Essendo un’operazione matematica Essendo un’operazione matematica fondamentale la ricerca si orienta sul package fondamentale la ricerca si orienta sul package java.java.langlang e sulla classe e sulla classe MathMath

•• Ci sono il metodo log (base e) e il metodo Ci sono il metodo log (base e) e il metodo log10 (base 10), ma in base 2 non c’èlog10 (base 10), ma in base 2 non c’è

•• Dovremo scrivercelo noiDovremo scrivercelo noi


Recommended