












































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Spiegazione della programmazione ad oggetti e delle sue caratteristiche, con esempi in Java. Classi e istanze, Package, Convenzioni, Variabili, Tipi Variabile, Costrutti condizionali, Costrutti iterativi (for each), I Metodi, Astrazione (Incapsulamento, Ereditarietà, Polimorfismo, L'override), Le interfacce, Thread e multi-threading, try-catch. In fine Link Utili per il Progetto.
Tipologia: Appunti
1 / 52
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!













































Java è un linguaggio puramente Object Oriented e ci impone questo tipo di logica strutturale. La logica della programmazione ad oggetti si basa su due concetti principali:
Quindi se creerò una classe "Numeri" composta:
Entriamo adesso nel vivo della trattazione spiegando come si creano classi ed oggetti. Creiamo la nostra classe "Numeri" con due attributi "numeroX" e "numeroY": public class Numeri { public int numeroX; public int numeroY; } Come si può vedere un attributo viene dichiarato secondo la sintassi: ModificatoreDiVisibilità (nell'esempio public), TipoDellaVariabile (nell'esempio int), NomeVariabile(numeroX e numeroY) Per quanto riguarda la parola chiave public rappresenta un modificatore di visibilità, ovvero indica che numeroX e numeroY sono due attributi che possono essere richiamti anche fuori dalla classe.
Abbiamo adesso creato la classe "Numeri" e la salviamo in un file chiamato "Numeri.java". Compilando adesso il file con il comando javac Numeri.java Così facendo otterremo un file compilato Numeri.class. Adesso potremo essere tentati di mandare in esecuzione il file con il comando java Numeri ma otterremo solamente un messaggio di errore, dato che una classe è soltanto una definizione di una struttura e all'interno della classe che abbiamo scritto non c'è un metodo main nel quale viene istanziata la classe. Definiamo un'altra classe nella maniera seguente e la chiamiamo "Implementazione": public class Numeri { public int numeroX; public int numeroY; } public class Implementazione { public static void main(String args[]){ //Prima istanza della classe Numeri Numeri numeri1; // Istanza numeri numeri1 = new Numeri(); //creazione Oggetti numeri1.numeroX=2; numeri1.numeroY=3; //Seconda istanza della classe numeri Numeri numeri2; numeri2 = new Numeri(); numeri2.numeroX=5; numeri2.numeroY=6; //Mostriamo a video i valori numeroX e numeroY delle due istanze System.out.println(numeri1.numeroX); //Stampa 2 System.out.println(numeri1.numeroY); //Stampa 3 System.out.println(numeri2.numeroX); //Stampa 5 System.out.println(numeri2.numeroY); //Stampa 6 } } La classe "Implementazione" contiene il solo metodo main che costituisce il punto d'inizio per l'esecuzione del programma. All'interno del main saranno presenti:
Prima di iniziare a scrivere del codice Java è bene apprendere delle piccole regole che stanno alla base per una scrittura di codice pulito:
Formalmente potremmo definire una variabile in un linguaggio di programmazione come la coppia composta da:
Nome: è una sequenza di lettere e cifre Convenzione: i nomi delle variabili inizino con una lettera minuscola, e qualora formati da più parole concatenate, tutte le parole successive alla prima siano capitalizzate (e non vengano usati i simboli _ e $). Ad esempio: int nomeDellaVariabileIntera;
Il tipo è l’insieme di caratteristiche che qualsiasi valore assunto da una variabile dovrà soddisfare. Il tipo determina :
In Java si distinguono tre tipi di variabili: variabili locali, variabili di istanza e variabili di classe. Vediamo in dettaglio di che si tratta.
Java è un linguaggio tipato, abbiamo già accennato a questo in precedenza, ciò significa che ogni variabile prima di essere utilizzata deve essere dichiarata: dobbiamo quindi assegnarle un nome ed un tipo.
I tipi primitivi in Java sono 8 e ciascuno di essi è pensato per rappresentare un certo tipo di informazione e utilizzando una quantià specifica di memoria. Tipo Q.tà di Memoria Valori Valore di default byte 8 bit da - 128 a 127 incluso 0 short 16 bit da - 32768 a 32767 incluso 0 int 32 bit da - 2147483648 a 2147483647 incluso 0 long 64 bit da - 9223372036854775808 a 9223372036854775807 incluso
float 32 bit Tipi di dati a Virgola mobile IEEE 754 0.0f double 64 bit Tipi di dati a Virgola mobile IEEE 754 0.0d boolean non specificato, ma sarebbe sufficiente un solo bit serve a rappresentare solamente 2 valori: vero o falso (true o false). false char 16 bit interi senza segno che rappresentano un carattere Unicode = da '\u0000' a '\uffff' \u
Ad ogni tipo primitivo corrisponde una cosiddetta classe involucro (wrapper) Tipo primitivo Classe Wrapper byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
È impossibile assegnare un double ad un float, senza un esplicito casting. Il casting consiste nel forzare un valore di un tipo ad assumere un tipo diverso:
double v1 = 10.0; float v2; int v3 = 5; //ERRORE v2 = (float) v1; // casting v1 = (double) v3;
Integer x = new Integer (10); Double y = new Double (5.5); Boolean z = Boolean.parseBoolean("true"); Queste operazioni sono note come operazioni di boxing, cioè “inscatolamento” del tipo primitivo nel relativo tipo wrapper al fine di utilizzare un oggetto e tutte le sue proprietà
L’auto-unboxing: dalla tipo wrapper al tipo primitivo Integer x = 10; Double y = 5.5f; Boolean z = true; Number n = 0.0f; Attraverso autoboxing gli oggetti scritti nello spezzone di codice vengono automaticamente creati con i valori di riferimento
L’unboxing dal tipo primitivo alla tipo wrapper int x = - 1; Integer y = x;
for(int j=0; j<=1; j++) { x[i][j] = i+j; } } for(int i=0; i<=1; i++) { for(int j=0; j<=1; j++) { System.out.println("x["+i+","+j+"] = "+x[i][j]); } } // Proviamo anche con le Stringhe String st[][]={{"riga 0 colonna 0","riga 0 colonna 1"}, {"riga 1 colonna 0","riga 1 colonna 1"}}; // scriviamo a schermo i valori for(int i=0; i<=1; i++) for(int j=0; j<=1; j++) System.out.println("st["+i+","+j+"] = "+st[i][j]); } } Naturalmente abbiamo voluto fare un esempio con solo un Array di due dimensioni, ma come avrete già intuito è possibile sviluppare anche Array di tre o ulteriori dimensioni.
Una stringa è una sequenza di caratteri, come per gli array, le posizioni vanno da 0 a n- 1 Definire una stringa in Java // esempio di oggetto String String OggettoStringa = new String("Valore testuale "); OggettoStringa = OggettoStringa + "dell'OggettoStringa"; System.out.println(OggettoStringa); //Avremo come risultato su schermo "Valore testuale dell'OggettoStringa" perchè abbiamo utilizzato l'operatore + per concatenare le due stringhe.
class ProvaArray2 { public static void main(String args[]) { float numero[] = {2.5f, 4.5f, 8.9f, 5.0f, 8.9f}; // notate la definizione di float con la f come // ultimo carattere del valore float somma = 0.0f; for(int i=0; i<= 4; i++) somma = somma + numero[i]; System.out.println("somma = " + somma) } } In quest'ultimo esempio utilizziamo il ciclo for per sommare tutti i valori dell'Array di numeri float. Il risultato sarà:
somma = 29.
I costrutti condizionali rispondono all’esigenza di eseguire diverse parti di un codice subordinatamente ad una determinata condizione.
if(condizione1) { //SE condizione ... } else if (condizione2) { //ALRIMENTI SE condizione 2 ... } else {//ALRIMENTI ... }
switch(c) { //INIZIO case value1: //SE c= ... break; //FINE case value2: //SE c= ... break; //FINE case valueN: //SE c=N ... default: //SE NON VIENE VERIFIACATO NIENTE ... //(in questo caso anche se c=n dato che tra il case N e default non c’è un break) } switch-case : salta alla riga con il valore corrispondente al valore dell’argomento di switch e da quella posizione continua eseguendo tutte le istruzioni senza tener conto i case. break: serve a terminare l’esecuzione di un blocco di programma (più precisamente ogni blocco associato a un ciclo iterativo o uno switch) ed anche se il costrutto switch-case è di gran lunga il contesto in cui lo si vede utilizzato, è sintatticamente corretto utilizzarla anche altrove. (tecnicamente parlando non fa parte del costrutto switch-case ma è spesso utilizzato in connessione ad esso e come abbiamo visto è opzionale) default: La clausola default è opzionale e serve a determinare una porzione di codice che sarà comunque eseguita quando non viene verificata nessuna clausola case
int c = ...; switch (c) { case 1: System.out.print("1 "); case 2: System.out.print("2 "); break; case 3: System.out.println("3 "); case 4: System.out.println("4 "); default: System.out.println("4+"); }
Il ciclo for pur servendo come i precedenti ad eseguire ripetutamente un blocco, fornisce una semplice sintassi per accomodare:
int i=0; while(i < 10) { ... i++; } è identico a: for(int i=0; i<10; i++) { ... }
Si osserva che essendo inizializzazione, incremento e condizione opzionali non è strano trovare casi in cui vengano omesse fino all’estremo: for(;;) { ... } letto anche for-ever o ciclo infinito, poiché la condizione di terminazione è omessa e per default considerata come true (il medesimo comportamento si otterrebbe naturalmente con “while(true) {}“).
for-each (detta for-in) che serve quando cui si voglia eseguire un determinato blocco di codice per ogni elemento di un array. for( Type item : itemCollection ) { ... } prendi uno ad uno gli elementi dell array itemCollection, assegna ciascuno di essi alla variabile item ed esegui per ciascun elemento il blocco (che potrà quindi usare item al suo interno). for-each, le Collection e i tipi generics Anche se parleremo più avanti di “Collection” e “generics”, in questa fase ci basta sapere che si tratta di collezioni di oggetti alle quali si applicano i cosiddetti iteratori per effettuare una scansione di tutti gli elementi. Ecco un esempio pratico di una tipica routine di iterazione degli elementi di un array che utilizzi i tipi generics: Queue