classi, oggetti ed altro gennaio 2003 IGEA 02-03, (c) FdA 1
file.java: sorgenti Java creati con editor javac.exe: compilatore Java es.: per compilare il sorgente in pippo.java usare javac pippo.java file.class: codice bytecode generati da compilatore Java java.exe: macchina virtuale Java es.: per eseguire il programma in pippo.class usare java pippo gennaio 2003 IGEA 02-03, (c) FdA 2
// tradizionale primo programma Java public class Ciao { public static void main(string[] args) { System.out.println("Ciao mondo!"); } } // deve essere nel file Ciao.java gennaio 2003 IGEA 02-03, (c) FdA 3
public class <nomeclasse> { public static void main(string[] args) { <istruzione1> <istruzione2> } } // ogni istruzione terminata da ; // salvato nel file <nomeclasse>.java gennaio 2003 IGEA 02-03, (c) FdA 4
componenti fondamentali che caratterizzano i linguaggi orientati agli oggetti (object-oriented) stretto legame: classe = fabbrica di oggetti gennaio 2003 IGEA 02-03, (c) FdA 5
componenti software che hanno proprietà specifiche contengono dati ed algoritmi per elaborarli offrono servizi agli utenti accesso ai dati elaborazione dei dati chi sono gli utenti? tipicamente, altri oggetti (è un mondo chiuso?) gennaio 2003 IGEA 02-03, (c) FdA 6
chi crea gli oggetti? le classi chi chiede a una classe di creare un oggetto? tipicamente, un altro oggetto tutti gli oggetti creati da una stessa classe appartengono alla stessa categoria ed hanno comportamento simile non sono eguali; es. le persone gennaio 2003 IGEA 02-03, (c) FdA 7
"Ciao mondo!" è un oggetto della classe String ogni stringa è un oggetto della classe String stringa = sequenza di caratteri scritti fra doppi apici "stringa di 23 caratteri" gli apici non vengono conteggiati gennaio 2003 IGEA 02-03, (c) FdA 8
fabbriche di oggetti ciascuna specializzata per una determinata categoria di oggetti definite dal programmatore riusabili esistono migliaia di classi già pronte, organizzate in package ogni package contiene molte classi gennaio 2003 IGEA 02-03, (c) FdA 9
public class Ciao { public static void main(string[] args) { System.out.println("Ciao mondo!"); } } la classe Ciao è in realtà molto particolare e non cattura lo spirito delle classi vere non ha neanche la capacità di fabbricare oggetti per definire classi più interessanti occorrono vari altri ingredienti gennaio 2003 IGEA 02-03, (c) FdA 10
Rectangle package java.awt abstract windowing toolkit costruisce oggetti Rectangle dati: coordinate (intere) del vertice nord-ovest base altezza algoritmi: modifica la dimensione/posizione del rettangolo confronta rettangolo con altre forme geometriche test di intersezione/contenimento ecc. accedi ai dati gennaio 2003 IGEA 02-03, (c) FdA 11
Rectangle import java.awt.rectangle; // per usare la classe public class Rettangolo { public static void main(string[] args) { System.out.println(new Rectangle(10, 20, 100, 40)); } } l istruzione import consente di (ri)utilizzare una classe preesistente l operatore new causa la costruzione di un oggetto output: java.awt.rectangle[x=10,y=20,width=100,height=40] significa: oggetto di tipo Rectangle contenente i dati specificati gennaio 2003 IGEA 02-03, (c) FdA 12
sintassi: new <nomeclasse>(<parametri>); parametri: n = 0 dati, separati da virgole se 0 parametri le parentesi tonde sono comunque richieste esempio new Rectangle(10, 20, 30, 40); esercizi: quali parametri hanno senso? new Persona( ); new Esame( ); gennaio 2003 IGEA 02-03, (c) FdA 13
nomi simbolici associati ad aree di RAM contenenti dati regole per i nomi: sequenze di caratteri alfanumerici (lettera o cifra) è ammesso il carattere non alfanumerico '_' il primo carattere non può essere cifra maiuscole e minuscole differiscono CASA è un nome differente da casa non sono ammesse le parole riservate o parole chiavi (es. new, class ) gennaio 2003 IGEA 02-03, (c) FdA 14
nomi legali pippo, Pluto, Zorro2, A25, b2b, casa_mia, Informatica_Grafica, system_var, MiNeSTRone, New nomi illegali 3volte, mamma mia, 007, public consuetudine (ma non regola): i nomi delle variabili iniziano con lettera minuscola gennaio 2003 IGEA 02-03, (c) FdA 15
ogni variabile è contraddistinta da un tipo che specifica quali categoria di dati può essere immagazzinata nella corrispondente area di RAM intero, reale, stringa ecc. per ogni variabile usata deve esserne dichiarato il tipo ogni variabile deve essere inizializzata deve esserle attribuito un valore mediante assegnazione gennaio 2003 IGEA 02-03, (c) FdA 16
esempi int voto; dichiarazione di variabile intera voto = 28; inizializzazione int eta = 22; dichiarazione + inizializzazione una variabile inizializzata può subire altre assegnazioni, purché non sia stata dichiarata final final int voto = 28; la variabile non potrà subire ulteriori assegnazioni gennaio 2003 IGEA 02-03, (c) FdA 17
<nometipo> <nomevariabile>; <nometipo> <nomevariabile> = <espressione>; esempio: String s = "Informatica grafica"; gennaio 2003 IGEA 02-03, (c) FdA 18
il tipo è una classe tengono traccia degli oggetti creati esempio: Rectangle cucina; cucina = new Rectangle(0, 0, 30, 40); Rectangle bagno = new Rectangle (40, 0, 30, 35); gennaio 2003 IGEA 02-03, (c) FdA 19
ogni variabile oggetto inizializzata è un riferimento ad uno specifico oggetto cucina Rectangle x=0 y=0 width=30 height=40 gennaio 2003 IGEA 02-03, (c) FdA 20
Rectangle k = cucina; cucina k Rectangle x=0 y=0 width=30 height=40 gennaio 2003 IGEA 02-03, (c) FdA 21
import java.awt.rectangle; public class Rettangolo { public static void main(string[] args) { Rectangle cucina = new Rectangle(0, 0, 30, 40); Rectangle k = cucina; System.out.println(cucina); System.out.println(k); k.translate(10, 10); // invocazione metodo System.out.println(cucina); System.out.println(k); } } gennaio 2003 IGEA 02-03, (c) FdA 22
java.awt.rectangle[x=0,y=0,width=30,height=40] java.awt.rectangle[x=0,y=0,width=30,height=40] java.awt.rectangle[x=10,y=10,width=30,height=40] java.awt.rectangle[x=10,y=10,width=30,height=40] NB La maniera standard di invocare un algoritmo (metodo) su un oggetto è scriverne il nome subito dopo il riferimento all'oggetto, usando un punto separatore gennaio 2003 IGEA 02-03, (c) FdA 23
specificatore di accesso public, o altro nome classe per convenzione, inizia per lettera maiuscola (ma non è una regola!) costruttore/i (da sviluppare successivamente) operazioni che vengono svolte nelle creazioni di oggetti (istanziazioni) variabili istanza (o campi, field) dati contenuti negli oggetti metodi algoritmi che si possono invocare su ciascun oggetto (istanza) gennaio 2003 IGEA 02-03, (c) FdA 24
public chiunque può chiedere alla classe di costruire oggetti per poi utilizzarli esistono anche protected e private nome: stesse regole per la definizione dei nomi di variabili public class Contatore { } gennaio 2003 IGEA 02-03, (c) FdA 25
variabili contenute in ogni istanza dovrebbero essere incapsulate fisicamente nascoste all'utente dell'oggetto, il quale sa che esistono ma non può accedervi direttamente (ma allora come fa ad usarle?) incapsulamento = principio fondamentale dell'ingegneria del software, su cui si basa la programmazione o-o in pratica, spesso private: in tal caso, solo la classe stessa può accedervi direttamente gennaio 2003 IGEA 02-03, (c) FdA 26
si dichiarano all'interno della classe rispettando la sintassi della dichiarazione variabili sintassi: <specificatorediaccesso> <tipovariabile> <nomevariabile>; gennaio 2003 IGEA 02-03, (c) FdA 27
public class Contatore { } private int valore; una classe può contenere un qualunque numero (anche nullo) di variabili istanza gennaio 2003 IGEA 02-03, (c) FdA 28
specificatore di accesso public o altro specifica chi può invocare il metodo un metodo pubblico può essere invocato da tutti tipo restituito tipologia dell'output dell'algoritmo, ovvero tipo di informazione (numero, stringa, o altro) restituita dal metodo alla sua terminazione istruzione return return <espressione>; fa terminare il metodo in esecuzione e restituisce il risultato specificato gennaio 2003 IGEA 02-03, (c) FdA 29
nome solite regole parametri formali lista di variabili separate da virgole per ciascuna variabili si specifica il tipo costituiscono di fatto l'input dell'algoritmo corpo o implementazione istruzioni Java che realizzano l'algoritmo o che consentono l'accesso alle varabili istanza gennaio 2003 IGEA 02-03, (c) FdA 30
<specificatorediaccesso> <tiporestituito> <nomemetodo> (<tipoparametro1> <nomeparametro1>, <tipoparametro2> <nomeparametro2>, ) { } <istruzioni del corpo> gennaio 2003 IGEA 02-03, (c) FdA 31
public class Contatore { private int valore = 0; // var. istanza public int getvalore() { // no parametri return valore; } public void contasu() {// non restituisce info valore = valore + 1; // valore++; } } gennaio 2003 IGEA 02-03, (c) FdA 32
sintassi accesso a variabili istanza (se consentito) <riferimentooggetto>.<nomevari abileistanza> invocazione metodo (se consentito) <riferimentooggetto>.<nomemeto do>(<listaparametri>) parentesi obbligatorie, anche se non vi sono parametri da specificare gennaio 2003 IGEA 02-03, (c) FdA 33
Contatore contascatti = new Contatore(); System.out.println (contascatti.getvalore()); contascatti.contasu(); System.out.println (contascatti.getvalore()); gennaio 2003 IGEA 02-03, (c) FdA 34
definizione di una seconda classe che esegua istruzioni di collaudo scriveremo una classe TestContatore non istanzia oggetti! public class TestContatore { public static void main(string[] args) { Contatore uso di un contascatti ambiente = new di collaudo Contatore(); System.out.println(contaScatti.getValore()); interattivo (avanzato) contascatti.contasu(); System.out.println(contaScatti.getValore()); } } ad esempio, BlueJ (http://www.bluej.org) gennaio 2003 IGEA 02-03, (c) FdA 35
un costruttore è un metodo il cui nome è eguale a quello della classe in cui è definito automaticamente eseguito quando una classe istanzia un oggetto new <nomeclasse>(<parametri>) attiva il costruttore della classe <nomeclasse> attivazione diversa dai metodi "normali", invocati tramite nome gennaio 2003 IGEA 02-03, (c) FdA 36
debbono la denominazione "costruttore" alla loro attivazione in fase di "costruzione" di un oggetto contengono istruzioni per inizializzare gli oggetti esistono in ogni classe anche se non li definiamo esplicitamente? gennaio 2003 IGEA 02-03, (c) FdA 37
<specificatorediaccesso> <nomeclasse> (<tipoparametro1> <nomeparametro1>, <tipoparametro2> <nomeparametro2>, ) { <istruzioni> } la sintassi è leggermente differente da quella di un metodo "normale" manca il tipo restituito gennaio 2003 IGEA 02-03, (c) FdA 38
determinano l'uso di new new <nomeclasse>(<e1>,,<ek>) se e solo se il costruttore <nomeclasse> ha k = 0 parametri formali i k valori sono detti parametri attuali i tipi dei k parametri formali corrispondono ordinatamente ai tipi dei k parametri attuali gennaio 2003 IGEA 02-03, (c) FdA 39
public Contatore(int inizio) { valore = inizio; } inizio è il parametro del metodo la variabile istanza valore dell'oggetto creato viene inizializzata con il valore contenuto nel parametro inizio new Contatore(<espressione>) <espressione> stabilisce il valore di inizio gennaio 2003 IGEA 02-03, (c) FdA 40
static benché le classi siano primariamente "fabbriche di oggetti" esse possono anche contenere variabili e metodi metodi e variabili statiche (static) sono risorse di classe: la classe, invece di un oggetto, può contenere, eccezionalmente, variabili e metodi è un uso "improprio" motivazioni discusse più avanti nel corso esempio rilevante: la classe Math gennaio 2003 IGEA 02-03, (c) FdA 41
Math classe standard di Java: java.lang.math non necessita import è automaticamente importata, come altre classi fondamentali (tutte quelle del package java.lang) contiene un gran numero di metodi numerici potenze reali, esponenziali, logaritmi, funzioni trigonometriche ecc. contiene le costanti matematiche e (costante di Nepero) e p gennaio 2003 IGEA 02-03, (c) FdA 42
costanti (variabili final) <nomeclasse>.<nomevariabile> es.: Math.E e Math.PI metodi <nomeclasse>.<nomemetodo> (<parametri>) es.: Math.sqrt(<espressione>), Math.cos(<espressione>) gennaio 2003 IGEA 02-03, (c) FdA 43
calcolo delle radici di un'equazione di 2 grado delta = b*b 4*a*c; r = Math.sqrt(delta); x1 = (-b + r) / (2*a); x2 = (-b r) / (2*a); se delta < 0? gennaio 2003 IGEA 02-03, (c) FdA 44
area del cerchio di raggio r r * r * Math.PI esponenziale e x Math.exp(x) log 10 x Math.log(x) / Math.log(10) gennaio 2003 IGEA 02-03, (c) FdA 45
tipi numerici interi, reali tipo booleano true, false caratteri simboli 'a', 'B', '$' stringhe "questa è una stringa" variabili oggetto riferimenti ad oggetti le variabili stringa sono riferimenti ad oggetti della classe String gennaio 2003 IGEA 02-03, (c) FdA 46
Keyword byte short int long float double char boolean Description (integers) Byte-length integer Short integer Integer Long integer (real numbers) Single-precision floating point Double-precision floating point (other types) A single character A boolean value (true, false) Size/Format 8-bit two's complement 16-bit two's complement 32-bit two's complement 64-bit two's complement 32-bit IEEE 754 64-bit IEEE 754 16-bit Unicode character true or false
int e double sono i più usati int: 32 bit in complemento a due double: 64 bit in virgola mobile le costanti numeriche sono di norma int o double 123456 è int 1.23456 è double 1.0 è double 3000000000 (3 miliardi) non è int, perché? gennaio 2003 IGEA 02-03, (c) FdA 48
+, -, *, /, % % definito fra interi: resto della divisione intera se operandi omogenei (stesso tipo), risultato omogeneo int + int dà int (rischio overflow) int / int dà int (inaspettato!) se operandi eterogenei si applica il principio della "conservazione dell'informazione" int * double dà double gennaio 2003 IGEA 02-03, (c) FdA 49
errore classico int a = 1; int b = 1; int c = 2; correzione: double media = (a+b+c) / 3; // assegna 1 double media = (a+b+c) / 3.; // assegna 1.3333333333 gennaio 2003 IGEA 02-03, (c) FdA 50
sintassi <nomevariabile> = <espressione>; i tipi debbono essere compatibili e non deve essere persa informazione tipi identici sono compatibili <variabile_double> = <valore_int>; (va bene) <variabile_int> = <valore_double>; (non va bene) gennaio 2003 IGEA 02-03, (c) FdA 51
boolean ammette i valori true (vero) e false (falso) esempio boolean pari = true; gennaio 2003 IGEA 02-03, (c) FdA 52
standard di documentazione: premettere ad ogni classe pubblica e a ciascun suo metodo pubblico un commento che ne descriva l'uso /** Il metodo serve a */ è possibile fare riferimento ai parametri (@param) e al valore restituito (@return) gennaio 2003 IGEA 02-03, (c) FdA 53
/** Il costruttore richiede la specifica della inizializzazione della variabile di conteggio @param start il valore iniziale del conteggio */ public Contatore(int start) { // costruttore inizio = start; valore = inizio; memoria = inizio; } gennaio 2003 IGEA 02-03, (c) FdA 54
javadoc sfrutta i commenti nel formato /** */ e costruisce automaticamente documentazione HTML delle classi e dei metodi uso: javadoc *.java aprire il file index.html gennaio 2003 IGEA 02-03, (c) FdA 55
This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.