Creazione di oggetti e Stringhe Linguaggi Java Creazione di oggetti e Stringhe In Java si possono creare oggetti da ogni classe di cui sia stato scritto del codice, e per utilizzarli in un programma è necessario che siano associati ad una variabile avente come tipo la classe stessa. La creazione di un oggetto in un programma avviene in due fasi: 1. definizione del tipo e del nome della variabile – si dichiara al programma che con il nome della variabile definita si farà riferimento ad un oggetto del tipo dichiarato, per il quale viene allocata una parte di memoria il cui indirizzo viene associato al nome della variabile: Lampadina dina; Scanner sc; 2. inizializzazione dell’oggetto – si crea l’oggetto vero e proprio che verrà salvato nella parte di memoria riservata nella fase 1 il cui indirizzo è associato al nome della variabile, e lo si fa chiamando il costruttore della classe con la sintassi fornita da Java: dina = new Lampadina(13); sc = new Scanner(System.in); oppure uguagliando la nuova variabile ad un oggetto dello stesso tipo già esistente. Lampadina dina, dino; dina=new Lampadina(13); dino=dina; dino è un oggetto di tipo Lampadina che dichiaro uguale all’oggetto dina: due oggetti per essere uguali devono avere tutto uguale, pertanto tutti i loro attributi devono avere gli stessi valori, di conseguenza per poter garantire l’uguaglianza nel tempo, punteranno alla stessa area di memoria. Le stringhe completano il panorama delle tipologie di dati comunemente utilizzati nella programmazione. Si rappresentano in Java tramite la classe java.lang.String, quindi in realtà ogni volta che utilizziamo una stringa, usiamo un oggetto di tipo String, che significa un’istanza della classe String. Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 1 Linguaggi Java Per le stringhe, essendo oggetti della classe String, si utilizza lo stesso meccanismo, con la differenza però che vengono memorizzate in un’area di memoria dedicata in cui una stessa stringa compare una volta sola. Pertanto, se creiamo due stringhe String s1=”Mario”; String s2=”Mario”; le variabili punteranno alla stessa zona di memoria poiché la stringa ”Mario” è unica nell’area di memoria delle stringhe, pertanto s1 ed s2 per la proprietà transitiva sono lo stesso oggetto e di conseguenza il test if (s1 == s2) è true Scrivendo invece String ss1=new String(“Mario”); String ss2=new String(“Mario”); Si creano due oggetti diversi che puntano a due aree di memoria diverse, di conseguenza il test if (ss1 == ss2) è false anche se entrambe le stringhe contengono il nome Mario, proprio perché sono due oggetti diversi. Quando operiamo con le stringhe dunque, dobbiamo sempre tener presente che sono degli oggetti, pertanto dobbiamo per sapere se hanno lo stesso contenuto. Per trattare l’oggetto Stringa è necessario conoscere la classe dalla quale viene creato l’oggetto, e per questo basta consultare la documentazione. Ad ogni modo i metodi più importanti forniti sono: equals(Object oo) – utilizzando come argomento la stringa con la quale si vuole fare il confronto, il metodo restituisce true se hanno lo stesso contenuto, false in caso contrario. String nome=new _string(”Gigi”); String nome1= new _string(”Gigi”); risulta if (nome == nome1) false if (nome.equals(nome1)) true if (nome.equals(“Giovanni”)) false if (nome.equals(“Gigi”)) true Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 2 Linguaggi Java concat(String str) – per concatenare due stringhe: il risultato sarà una stringa ottenuta affiancando i contenuti delle due stringhe: String s1=”Mario”; String s2=”Rossi”; String s3 = s1.concat(s2); Il contenuto di s3 sarà S3=”MarioRossi” Si ottiene lo stesso risultato utilizzando l’operatore + tra le due stringhe S3=s1 + s2; int length() – lunghezza della stringa: il metodo restituisce il numero di caratteri dai quali è formata la stringa int lung = s1.length(); e visto che la parola Mario ha 5 lettere, lung conterrà il numero 5 charAt(int n) – estrae dalla stringa il carattere che si trova alla posizione di indice n, cioè il carattere in posizione (n+1): char e=s1.charAt(3) - e contiene la lettera i substring(int x) – estrae una sottostringa che parte dal carattere di posizione (x+1) fino alla fine della stringa String s=”Mario Rossi”; String z=s.substring(3) z=”io Rossi” substring(int x, int y) – il metodo restituisce la stringa che inizia alla posizione x iniziando a contare da 0 fino alla posizione y: String s=”Mario Rossi”; String z=s.substring(0,4) z=”Mario” trim() – la funzione elimina gli spazi non significativi da una stringa, vale a dire gli spazi ripetuti e quelli ad inizio e fne stringa String val=” nel mezzo della mattinata “; String sz= val.trim() sz=”nel mezzo della mattinata” Questa funzione che può sembrare banale, non lo è affatto, poiché previene gli errori di digitazione nei confronti: String uno=”Gian Maria”; String due=”Gian Maria”; if (uno.equals(due)); false i campi uno e due sono diversi poiché uno ha due spazi tra i due nomi, mentre è evidente che si tratta dello stesso nome. Per non intercorrere in questo tipo di errore si scriverà in quanto il metodo trim() dell’oggetto di tipo String restituisce un oggetto di tipo String, che possiede dunque tutti i metodi del tipo String. int indexOf(String ff) – restituisce un numero intero che rappresenta l’inizio nella stringa della sottostringa indicata tra parentesi; se la stringa non viene trovata, il metodo restituisce il valore -1. String uno = “Pippo Pluto e Paperino”; Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 3 Linguaggi Java int posPluto= uno.indexOf(“Pluto”); posPluto conterrà il numero 6, che è l’indice, cominciando a contare da 0, della posizione di inizio della parola Pluto nella stringa uno. Esercizio: costruire una classe Lampadario che rappresenti un lampadario con 6 lampadine che abbiano come colore diverse tonalità di blu e di giallo (es giallo sole, giallo canarino, blu mare, blu cobalto, giallo senape, blu notte). La classe lampadario ha sette metodi: accendiTutte che accende tutte le lampadine, accendiGiallo che accende le sole lampadine gialle, accendiBlu che accende tutte le lampadine blu, con i rispettivi metodi di spegnimento ed un metodo testaLampadine che segnala lo stato di tutte le lampadine e quanti click possono ancora fare. Ognuno dei metodi deve segnalare l’eventuale rottura delle lampadine. Un possibile schema è package lampadario; import java.util.Random; import java.util.Scanner; public class Lampadario { Lampadina vettLamp[]; int numLampadine, nuClick, in; String colore; Scanner sc = new Scanner(System.in); public Lampadario(int nu){ numLampadine=nu; vettLamp=new Lampadina[numLampadine]; Random casuale = new Random(); for (in=0; in<numLampadine; in++) { nuClick = casuale.nextInt(20); System.out.println("di quale colore vuoi la lampadina " + (in+1)); colore=sc.nextLine(); Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 4 Linguaggi Java vettLamp[in] = new Lampadina(nuClick, colore); } } public String accendiTutte(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { ret=vettLamp[in].accendi(); if (ret.equals("rotta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è rotta "; } if (ret.equals("già accesa")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è già accesa "; } if (ret.equals("")) { contaOk++; } } msg=msg + "accese " + contaOk + "lampadine"; return msg; } public void testaLampadine(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { System.out.println("lampadina " + vettLamp[in].coloreLuce + " " + vettLamp[in].getStato() + " ancora " + (vettLamp[in].getAncoraClick() + " click")); } } public String spegniTutte(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { ret=vettLamp[in].spegni(); if (ret.equals("lampadina rotta")) { Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 5 Linguaggi Java msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è rotta "; } if (ret.equals("lampadina già spenta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è già spenta "; } if (ret.equals("")) { contaOk++; } } msg=msg + "spente " + contaOk + " lampadine"; return msg; } public String accendiGialle(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { if ( (vettLamp[in].coloreLuce).indexOf("giallo") >= 0 ) { ret=vettLamp[in].accendi(); if (!ret.equals("")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " " + ret; } else { contaOk++; } } } msg=msg + "accese " + contaOk + " lampadine"; return msg; } public String spegniGialle(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { if ( (vettLamp[in].coloreLuce).indexOf("giallo") >= 0 ) { Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 6 Linguaggi Java ret=vettLamp[in].spegni(); if (ret.equals("rotta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " “ rotta "; } if (ret.equals("già spenta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è già spenta "; } if (ret.equals("")) { contaOk++; } } } msg=msg + "spente " + contaOk + " lampadine"; return msg; } public String accendiBlu(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) { if ( (vettLamp[in].coloreLuce).indexOf("blu") >= 0 ) { ret=vettLamp[in].accendi(); if (!ret.equals("")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " " + ret; } else { contaOk++; } } } msg=msg + "accese " + contaOk + " lampadine"; return msg; } public String spegniBlu(){ String msg="", ret; int contaOk=0; for (in=0; in<numLampadine; in++) Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 7 Linguaggi Java { if ( (vettLamp[in].coloreLuce).indexOf("blu") >= 0 ) { ret=vettLamp[in].spegni(); if (ret.equals("rotta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è rotta "; } if (ret.equals("già spenta")) { msg=msg + "lampadina " + vettLamp[in].coloreLuce + " è già spenta "; } if (ret.equals("")) { contaOk++; } } } msg=msg + "spente " + contaOk + " lampadine"; return msg; } } package lampadario; /** * Class Lampadina * fornisce una lampadina in grado di accendersi e spegnersi tramite il relativo metodo. * La lampadina controlla il suo stato e se viene superato il massimo numero di click * passa allo stato di rotta e non si accende e spegne più * * @author flavia * */ public class Lampadina { private int stato, maxClick, contaClick; String coloreLuce; public Lampadina (int m){ /** * costruttore che imposta il massimo numero click che può fare */ maxClick=m; stato=0; contaClick=0; Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 8 Linguaggi Java } public Lampadina (int m, String c){ /** * costruttore che imposta il massimo numero click che può fare ed il colore della luce */ maxClick=m; stato=0; contaClick=0; coloreLuce=c; } public String accendi(){ String msg=""; contaClick=contaClick+1; switch (stato) { case 0 : if (contaClick == maxClick) { stato=2; msg="rotta "; } else { stato=1; } break; case 1 : if (contaClick == maxClick) { stato=2; msg="rotta "; } else { msg="già accesa"; } break; case 2 : msg="rotta "; break; } return msg; } public String spegni(){ String msg=""; Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 9 Linguaggi Java contaClick=contaClick+1; switch (stato) { case 1 : if (contaClick == maxClick) { stato=2; msg="rotta "; } else { stato=0; } break; case 0 : if (contaClick == maxClick) { stato=2; msg="rotta "; } else { msg="già spenta"; } break; case 2 : msg="rotta "; break; } return msg; } public String getStato(){ String risp=""; switch (stato) { case 0: risp="spenta"; break; case 1: risp="accesa"; break; case 2: risp="rotta"; break; } return risp; } public int getNumClick(){ return contaClick; Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 10 Linguaggi Java } public int getAncoraClick(){ return (maxClick-contaClick); } public int getMaxClick(){ return maxClick; } public void setColoreLuce(String co){ coloreLuce=co; } } package lampadario; import reparto.Reparto; import java.util.*; public class ProvaLampadario { public static void main(String args[]){ boolean ciclo=true; String azione, ret=""; Scanner sc=new Scanner(System.in); Lampadario ll = new Lampadario(6); while (ciclo == true) { System.out.println("scegli l'azione da fare "); System.out.println("at - accendi tutte "); System.out.println("ag - accendi gialle "); System.out.println("ab - accendi blue "); System.out.println("st - spegni tutte "); System.out.println("sg - spegni gialle "); System.out.println("sb - spegni blue "); System.out.println("tl - testa lampadine "); System.out.println("u - uscire"); azione=sc.nextLine(); if (azione.equals("at")) { ret=ll.accendiTutte(); } if (azione.equals("ag")) { ret=ll.accendiGialle(); } if (azione.equals("ab")) { ret=ll.accendiBlu(); Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 11