dott. federico buti - unicam · raggruppare parti di codice, svolgendo la funzione di “segni di...
Post on 16-Feb-2019
226 Views
Preview:
TRANSCRIPT
Installiamo Java…
http://java.sun.com/javase/downloads/index.jsp
Download della JDK e della documentazione:
JDK 6 Update 18
Java SE 6 Documentation
Eseguire il file scaricato
Al termine aprire il prompt dei comandi e digitare “java” per verificare il completamento dell’installazione
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 2
Installiamo Java… (New Linux)
chmod +x file_Scaricato.bin
./file_Scaricato.bin
mv cartella /usr/java (crearla se inesistente)
Modificare /etc/profile aggiungendo:
JAVA_HOME="/usr/java/cartella"
export JAVA_HOME
Ubuntu: sudo apt-get install sun-java6-jdk sun-java6-doc
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 3
Installiamo eclipse IDE
http://www.eclipse.org/downloads/
Scaricare Eclipse IDE for Java Developers
Decompattare il pacchetto e porre la directory nellaposizione desirata
Tra poco vedremo eclipse nel dettaglio…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 4
Lessico
Gli elementi lessicali (cioè le unità di base, le parole e i segni di interpunzione) della grammatica Java sono codificate Unicode; sono quindi sequenze di caratteri rappresentati su 16 bit
Il programma è costituito da una serie di istruzioni, ciascuna istruzione indica un'azione diversa
Ogni istruzione termina con un punto e virgola ";" (il punto fermo della grammatica Java)
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 5
Separatori
Il separatore è un carattere che permette di separare o raggruppare parti di codice, svolgendo la funzione di “segni di interpunzione”. In Java sono sei:
11/03/2010Università di Camerino - Scuola di Scienze e Tecnologie
6
Separatore Funzione
() accanto a metodi e istruzioni per specificarne i parametri
{} separa blocchi di codice di più righe
[] identifica elementi di array o collezioni
; separa le istruzioni
, separare i valori quando si chiamano le funzioni
. richiamare i membri di una classe
Commenti
Sono delle porzioni di testo presenti nel codice sorgente che servono a completarlo con delle annotazioni che il compilatore non legge. Possono essere:
Multiriga/*
* questo è il commento
* su più righe
*/
Singola riga //questo è il commento su una riga
Vediamo ora la struttura data al sorgente…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 7
Assegnamento In Java, come in tutti i linguaggi, possiamo definire variabili e
costanti. Esse sono locazioni di memoria che contengono dati,
informazioni. Le variabili, come dice il nome, sono locazioni di memoria in cui
il valore contenuto cambia durante l’esecuzione del programma Le costanti invece non cambiano il loro valore dopo la loro
inizializzazione (inserimento del valore iniziale).
Inserimento di un valore in una variabile (o costante) avviene tramite il processo di assegnamento attraverso il simbolo “=” e la valutazione dell’espressione che lo segue. Cioè:
<tipo> <identificativoVariabile> = <espressione da valutare>
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 8
Assegnamento
L’identificativo della variabile serve a NOI programmatori per dire univocamente al compilatore quale valore ritornarci (quello contenuto nella variabile!)
Siccome Java è un linguaggio strongly typed cioè a tipizzazione forte, non possiamo dichiarare una variabile senza definirne il tipo (si veda la slide precedente).
Il tipo dice al compilatore il range di valori ammessi dalla nostra variabile.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 9
Assegnamento
La parte a destra sarà valutata dal compilatore e il risultato assegnato alla variabile. Alcuni esempi:
int numero = 23;
int numero2 = numero;
int numero3 = numero + numero2;
int rappresenta uno dei tipi primitivi del linguaggio, messi a disposizione del programmatore
Esso rappresenta un intero, un numero senza virgola
Vediamo gli altri tipi primitivi messi a disposizione…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 10
Tipi primitiviTipo Valore Valore di
default
boolean valori che possono essere true e false false
char i caratteri, sono di 16 bit, e sono codificati Unicode 1.1.5, negli altri linguaggi sono ASCII, di soli 8 bit
\u0000
byte interi di 8 bit con segno, ovvero numeri compresi tra -27
e 2
80
short interi di 16 bit con segno 0
int interi di 32 bit con segno 0
long interi di 64 bit con segno 0
float reali di 32 bit in virgola mobile (IEEE 754-1985) 0.0
double reali di 64 bit in virgola mobile (IEEE 754-1985) 0.0
11/03/2010 11Università di Camerino - Scuola di Scienze e Tecnologie
Tipi primitivi
Un numero intero è un numero senza decimali che può essere sia positivo che negativo; in Java è int
Una variabile int può contenere i numeri interi da –2147483648 a +2147483647
I float contengono un certo numero di cifre significative e la posizione della virgola (che si può spostare cioè “flottare”); la virgola è rappresentata come punto “.” 2.3, 45.3, ecc…
float: da 2-149 a (2-2-23)*2127
double: da 2-1074 a (2-2-52)*21023
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 12
Oggetti
Tutti i linguaggi forniscono delle astrazione
Un linguaggio object-oriented come Java mette a disposizione strumenti (gli oggetti) con i quali il programmatore può rappresentare elementi nello spazio dei problemi
Ciascun oggetto assomiglia ad un piccolo computer: ha uno stato (i suoi attributi – variabili e costanti o anche altri oggetti) e delle possibili operazioni (metodi, in pratica funzioni!). Come gli oggetti della vita reale!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 13
Dagli oggetti alle classi
Oggetti con caratteristiche e comportamenti comuni appartengono alla medesima classe: La classe degli uccelli (fringuello, passero, tordo…)
La classe delle automobili (Grande Punto, Z3, Cruiser…)
Gli oggetti di una classe hanno identici comportamenti e caratteristiche ma con valori diversi.
Nella classe uccelli tutti gli uccelli avranno l’attributo apertura_alare, ma questo avrà valore diverso per un oggetto aquila o per un oggetto passero!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 14
L’idea!
Piuttosto che codificare l’oggetto specifico di nostro interesse noi codifichiamo la sua classe cioè la sua generica definizione in termini di attributi e attività svolte.
In questo modo possiamo rappresentare tutti i possibili oggetti cambiando solo i valori degli attributi, cioè delle variabili!
Data la classe Auto noi possiamo definire sia Z3 che GP senza dover scrivere due volte la specifica dell’oggetto!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 15
La classe come tipo di dato
La classe allora può essere vista come un tipo di dato
Facendo un parallelo, il tipo primitivo int ammette un certo range di valori (-8, +201293, -100000, ecc…)
Un tipo Auto ammetterà un range di valori datidall’insieme dei valori assumibili dai suoi attributi edalla combinazione di essi, per esempio…
gp (1400, 5porte, benzina, blu)
gp (1200, 3porte, benzina, rosso)
z3(2500, 3porte, benzina, rosso)
…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 16
La classe come tipo di dato
Osservate le due dichiarazioni:
Auto gp = new Auto(1400cc, blu, 5porte ....);
int numero = 23;
In entrambi i casi generiamo una variabile. Nel primo di tipo complesso (tipo Auto) nel secondo primitivo (un intero) e gli assegniamo (“=”) un valore!
Chiaramente nel caso di un tipo complesso non possiamo assegnargli semplicemente un valore: dobbiamo caricare i campi della classe per generarne un oggetto effettivo!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 17
Costruttori
Le direttive di creazione di un oggetto sono specificate nel suo (o suoi, se ce ne sono diversi) costruttore
Essi sono dei metodi (o funzioni) richiamati al momento dell’assegnamento della variabile oggetto (tramite la parola chiave new).
Nel nostro caso la riga di codiceAuto gp = new Auto(1400cc, blu, 5porte ....);
ci dice: “genera un nuova variabile chiamato gp di tipo Auto sulla base di queste caratteristiche…”
Sarà poi il costruttore, nel suo codice, a mappare i parametri passati negli attributi della classe
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 18
Costruttori e metodi
Il costruttore e i metodi sono funzioni della nostra classe.
Ne definiscono il comportamento e in generale hanno un input e un output
I costruttori a differenza dei metodi non hanno un tipo di ritorno, visto che si occupano di caricare i campi della classe. Possiamo dire che essi ritornano un oggetto di una data classe (si veda il codice con la new
alle pagine precedenti).
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 19
Confronto<Nome Classe>(<parametri>){
corpo del costruttore;
}
<tipo> pippo(<parametri>){
corpo del metodo;
return <tipo> //questa è sempre l’ultima istruzione!!
}
È facile notare che il costruttore ha nome identico alla classe di appartenenza , mentre il metodo ha un nome proprio (“pippo” in questo caso).
Possiamo notare inoltre il tipo ritornato nel caso del metodo(<tipo>)
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 20
Metodi – alcuni dettagli in più Interpretare il comportamento di un metodo è abbastanza
semplice. Osserviamo la sua definizione:
int somma(int numero1, int numero2){
int valoreSomma = numero1 + numero2;
return valoreSomma
}
“int” alla sinistra ci dice cosa il metodo restituirà (un intero in questo caso)
I valori tra parentesi sono invece i valori richiesti in input, in questo caso due interi
Lo possiamo vedere come una scatola: prende uno o più valori dentro di se e ne restituisce degli altri (tramite la return)
Se il tipo ritornato dal metodo è void allora il metodo non tornerà nessun valore: non avrà la parola chiave return
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 21
Metodo main
Un particolare metodo è il main. Tale metodo è un metodo speciale, è per default il metodo di partenza delle applicazioni java.
È concettualmente una sorta di inizio o di boot o di indice di una applicazione.
Esso permette di istanziare le classi del nostro programma, cioè generare gli oggetti dai nostri tipi (le classi appunto) e farli interagire per ottenere il risultato cercato.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 22
Costruttore di default
Se noi non specifichiamo un costruttore, Java inserisce nella classe quello che viene chiamato costruttore di default.
Si tratta di un costruttore senza parametri (le parentesi tonde non contengono parametri).
A meno che noi non lo ridefiniamo (inseriamo nel suo corpo delle istruzioni) esso non farà nulla ma allocherà solamente dello spazio in memoria per un oggetto della classe (effettivamente vuoto, dato che i suoi attributi non sono stati caricati dal costruttore stesso)
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 23
Voi avete il controllo…
Ricordate sempre che : Siete VOI che definite la classe:
Ne definite gli attributi (variabili, costanti)
Ne definite i comportamenti (metodi)
Siete VOI che definite il costruttore della classe e quindi il modo in cui gli oggetti della classe stessa vengono generati (oppure vi affidate al costruttore di default…)
Insomma, voi decidete TUTTO del vostro programma! Comprese le classi, e quindi gli oggetti, che ne compongono la logica di esecuzione
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 24
Var. primitive e var. oggetto
Riprendiamo l’esempio visto precedentemente:Auto gp = new Auto(1400cc, blu, 5porte ....);
int numero = 23;
Abbiamo detto che in entrambi i casi abbiamo due variabili, una primitiva e una oggetto (della classe Auto in questo caso)
Le due variabili sono però ben diverse nella loro logica interna.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 25
Variabili primitive
Esse sono veri e propri contenitori di informazionicome li avevamo definiti all’inizio.
Se quindi assegniamo una variabile ad un’altra copieremo il valore della prima alla seconda. L’avevamo già visto parlando dell’assegnamento. Un ulteriore esempio:
int numero = 44 + 55;
int numero2 = numero;
In questo caso entrambi conterranno una propria copia dello stesso valore: 99
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 26
Variabili oggetto o riferimento
Le variabili oggetto invece NON contengono il valore, l’oggettoeffettivo. Esse sono riferimenti alla locazione della memoria in cuil’oggetto è stato creato.
Tale memoria si chiama HEAP ed è gestita interamente dalla JVM.Supponendo di aver generato due oggetti Auto, grande punto e Z3avremmo questa situazione:
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 27
HEAPgp
1400Blu
…
gp
z3
2500Rossa
…
z3
Assegnamento di var. riferimento
Osserviamo ora questo caso:
Auto gp = new Auto(1400cc, blu, 5porte ....);
Auto z3 = GP
Qui abbiamo dichiarato una grande punto e poi una z3 cui abbiamo assegnato il valore della variabile grande punto.
z3 è una variabile riferimento come gp e quindi punterà lo stesso oggetto di quest’ultimo!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 28
Assegnamento di var. riferimento
Questo implica che una modifica dello stato dell’oggetto da parte del riferimento gp sarà visibile anche a z3.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 29
HEAPGP
1400Blu
…
GP Z3
Esempio Torcia.javapublic class Torcia {
boolean acceso;
void accendi() {
acceso = true;
}
void spegli() {
acceso = false;
}
boolean isAcceso() {
return acceso;
}
public static void main(String args[]) {
Torcia miaTorcia = new Torcia(); // CREAZIONE OGGETTO
Torcia secondaTorcia = miaTorcia; // CREAZIONE ALTRA VARIABILE RIFERIMENTO
miaTorcia.accendi(); // ACCENSIONE TORCIA
boolean stato = miaTorcia.isAcceso();
System.out.println(stato);
//
boolean stato2 = secondaTorcia.isAcceso();
System.out.println(stato);
// MODIFICHIAMO LA TORCIA DA MIATORCIA...
miaTorcia.spegli();
// ...E STAMPIAMO LO STATO DA SECONDATORCIA...
stato = secondaTorcia.isAcceso();
System.out.println(stato);
}
}
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 30
Un po’ di sintassi…
La definizione della classe è sempre contenuta nelle parentesi graffe:
public class TriangoloRettangolo {
---attributi---
---metodi---
}
Gli attributi saranno delle variabili primitive (int, short, boolean…) o variabili riferimento ad oggetti (Auto gp, Auto z3, ecc…).
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 31
Un po’ di sintassi…package it.unicam.cs.esercizi;
public class TriangoloRettangolo {
float base;
float altezza;
public TriangoloRettangolo(float miabase, float miaaltezza){
base = miabase;
altezza = miaaltezza;
}
float calcolaArea(){
float area = (base * altezza)/2;
return area;
}
void stampaBase(){
System.out.println(base);
}
}
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 32
Un po’ di sintassi…package it.unicam.cs.esercizi;
public class TriangoloRettangolo {
float base;
float altezza;
public TriangoloRettangolo(float miabase, float miaaltezza){
base = miabase;
altezza = miaaltezza;
}
float calcolaArea(){
float area = (base * altezza)/2;
return area;
}
void stampaBase(){
System.out.println(base);
}
}
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 33
Definizione del package. È il PRIMO elementodel codice. Opzionale.
Il nome della classe inizia sempre con una MAIUSCOLALa classe si chiama come il file in cui è salvata.
Costruttore. Non presenta un tipo di ritorno (adifferenza dei metodi qui sotto).
Un metodo qualunque. Presenta il ritorno (float) che viene ritornato al chiamante con la parola chiave “return”
Questo metodo è “void”, non ritorna nessun valore einfatti non presenta nessuna istruzione “return”!I metodi iniziano sempre con la prima lettera MINUSCOLA!!
Un po’ di sintassi…
Ricordate che ogni singola riga di codice, ogni comando deve terminare con un “;”. (si veda l’esempio “TriangoloRettangolo”)
L’accesso, e quindi l’uso, dei campi e dei metodi di un oggetto viene invece garantito dal punto “.”; es:
TriangoloRettangolo tri = new TriangoloRettangolo(9, 5);
float area = tri.calcolaArea();
In questo caso generiamo un oggetto di tipo TriangoloRettangolo chiamato “tri” e richiamiamo (tramite il punto) il suo metodo “calcolaArea()”
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 34
Riassumendo…
L’abbiamo già accennato più volte ma ripetiamolo: noi definiamo la classe in termini di caratteristiche (variabili e costanti) e di comportamenti (metodi, anche detti funzioni).
L’utilizzo di variabili e comportamenti avviene a livello di oggetto. Riprendendo l’esempio dell’auto: noi definiamo un metodo “accensione()” ma questo metodo lo chiameremo solo su un oggetto della classe auto, come gp o z3, e non sulla classe! Se vogliamo considerare l’esempio del triangolo fatto a lezione…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 35
Triangolo…public static void main(String args[]){
TriangoloRettangolo tri = new TriangoloRettangolo(9, 5);
float area = tri.calcolaArea();
System.out.println(area);
}
Nel metodo main generiamo tramite il costruttore un oggetto triangolo di base 9 e altezza 5; un specifico triangolo, referenziato in memoria dalla variabile “tri”. A questo punto con il “.” possiamo richiamare il metodo di calcolo dell’area su quello specifico oggetto!
(se volete eseguire la classe triangolo presentata in una delle slide precedenti avete bisogno di aggiungervi un main come quello qui sopra)
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 36
Esercizio È possibile, dato un dato anno y calcolarne il giorno di Pasqua tramite
il seguente algoritmo di Gauss: Sia y l’anno Dividi y per 19 ottenendo il resto a. Dividi y per 100 ottenendo il quoziente b e il resto c Dividi b per 4 ottenendo quoziente d e resto e Dividi 8 * b + 13 per 25 ottenendo il quoziente g Dividi 19 * a + b - d - g + 15 per 30 ottenendo il resto h Dividi c per 4, ottenendo il quoziente j e il resto k Dividi a + 11 * h per 319, ottenendo il quoziente m
Dividi 2 * e + 2 * j - k - h + m + 32 per 7 ottenendo il resto r Dividi h - m + r + 90 per 25, ottenendo il quoziente n Dividi h - m + r + n + 19 per 32 ottenendo il resto p Pasqua cade il giorno p del mese n!!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 37
Esercizio
Definite una o più classi che dato in input un anno (2ooo, 1999, 2004…) calcola p e n mettendo a disposizione due metodi per ottenere tali valori.
Ragionate con il solito principio: che tipo di oggetti posso individuare nel contesto del mio
problema?
Che tipo di attributi e comportamenti devono avere?
Avrete sicuramente bisogno di diversi assegnamenti di variabile…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 38
Packages
Un package Java è un meccanismo per organizzare classi Java all'interno di sottogruppi
I Package sono di solito definiti usando una struttura gerarchica, indicando i livelli di gerarchia con dei punti
In generale, un nome comincia con il dominio di primo livello dell'organizzazione che lo produce, seguito da sottodomini, elencati in ordine inverso.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 39
Packages
L'organizzazione può infine scegliere un nome specifico per quel particolare package
Sempre per convenzione, i nomi dei package dovrebbero contenere solo lettere minuscole
Un possibile nome per un progetto della nostra università è:
it.unicam.cs.progetto
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 40
Packages – parole chiavi Nei file sorgente di Java, il package a cui appartiene il file è specificato
con l'istruzione package (ricordate, PRIMA istruzione del codice, SEMPRE!):package it.unicam.cs.progetto;
Per usare un package all'interno di un file sorgente Java è necessario includere le classi di quel package con l'istruzione import:import java.awt.event.*;
Usare la stella “*” include tutte le classi contenute nel package mentre sostituirla con un nome specifico ci permette di specificare una certa classe da importare. Tale classe potrà poi essere usata nel nostro codice.
Il package java.lang è importato implicitamente; esso contiene le funzionalità di base del linguaggio e tipi di dato fondamentali
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 41
Packages - esempio
package programma.mio_programma;
public class pippo {….
…
}
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 42
programma mio_programma
Pippo.java
Operatori
Gli operatori manipolano e confrontano le variabili e sono dunque alla base di ogni programma; Java ne mette a disposizione molti, con una sintassi simile a quella del C
Classifichiamo gli operatori in tre categorie a seconda del numero di operandi: unari (uno), binari (due) e ternari (tre). Cominciamo da quelli binari, i più comuni
11/03/2010 43Università di Camerino - Scuola di Scienze e Tecnologie
Operatori binari
Gli operatori binari agiscono su due variabili semplici (non su oggetti) di tipo compatibile (due double, un double e un int, ecc…), per produrre un risultato
Chiaramente nel caso di operazioni tra double e int il risultato sarà double!
Sono a loro volta divisi in: Algebrici
Relazionali
Booleani
Funzionali
11/03/2010 44Università di Camerino - Scuola di Scienze e Tecnologie
Operatori algebriciOperatore Uso Significato
+ a + b somma a e b
- a - b sottrae b da a
* a * b moltiplica a per b
/ a / b divide a per b (sia intera che non)
% a % bresto della divisione intera di a per b (solo con int, longint e byte)
11/03/2010 45Università di Camerino - Scuola di Scienze e Tecnologie
La divisione viene gestita a seconda del tipo associato ai suoi termini:
25 / 4 = 6 25 e 4 sono int
25 / 4.0 = 6.25 questo perché 4.0 NON è intero!
Operatori relazionali
Operatore Uso Significato
== a == b vero se a è uguale a b
!= a != b vero se a è diverso da b
> a > b vero se a è maggiore di b
< a < b vero se a è minore di b
>= a >= b vero se a è maggiore o uguale a b
<= a <= b vero se a è minore o uguale a b
11/03/2010 46Università di Camerino - Scuola di Scienze e Tecnologie
Operatori booleani
Orientati ai bit: agiscono su i singoli bit di cui sono composti gli operandi, eseguono cioè l'operazione su ogni coppia di bit (i primi, i secondi...) separatamente. Vanno applicati solo alle variabili numeriche
Operatore Uso Significato
&& a() && b() vero se a() vero e b() vero
|| a() || b()True se a() vero o b() vero o entrambi veri
11/03/2010 47Università di Camerino - Scuola di Scienze e Tecnologie
Operatori #= Istruzioni come le seguenti sono frequenti:
a = a + 1; b = 3 * b; c = c % d; e = e + f; …
Si può usare la forma abbreviata <operatore>= come segue: a += 1; b *= 3; c %= d; e += f; …
11/03/2010 48Università di Camerino - Scuola di Scienze e Tecnologie
Operatori Unari
11/03/2010 49Università di Camerino - Scuola di Scienze e Tecnologie
Operatore Uso Significato
- -a inverte il segno di a
! !a inverte il valore di verità di a
~ ~a complemento a uno di a
Il primo è algebrico, gli altri due sono booleani!!
Conversioni esplicite e implicite
Nell’eseguire operazioni tra tipi eterogenei il compilatore esegue delle conversioni per omogeneizzare gli operandi. Queste operazioni prendono il nome di upcasting e downcasting (o semplicemente casting).
L’upcasting è automatico in quanto viene applicato quando si passa da un tipo ad un altro “che lo contiene” (niente perdita di dati). Il downcasting non è automatico!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 50
Upcasting & downcasting
Un intero è anche un float (senza cifre decimali) e può essere scritto come una stringa. Per cui è lecito scrivere:
int var1 = 2;
double var2 = 4;
double var3 = var1 + var2;
System.out.println(var3);
Viceversa è errato scrivere:int var1 = 2.45;
Questo perché 2.45 è chiaramente un valore non intero
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 51
Forzare il downcast
Nell’ultimo caso la conversione al formato scelto può essere forzato tramite cast esplicito al tipo.
Possiamo cioè scrivere:
int var1 = (int) 2.45;
ottenendo il troncamento del valore a 2.
Possiamo anche applicarlo ad intere espressioni:
int totale_Intero = (int) (2.75 + 3.2);
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 52
Classi wrapper (involucro)
In varie situazioni, può essere comodo poter trattare i tipi primitivi come oggetti.
Una classe wrapper (involucro) incapsula una variabile di un tipo primitivo “trasformando” un tipo primitivo in un oggetto equivalente
La classe wrapper ha nome (quasi) identico al tipo primitivo che incapsula, ma con l’iniziale maiuscola
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 53
Classi wrapper (involucro)Tipo primitivo Classe “wrapper” corrispondente
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 54
Tutte le classi involucro fanno parte di java.lang per cui sono disponibili senza bisogno di alcun import!!
Classi wrapper (involucro)
Ogni classe wrapper ha come stato semplicemente un attributo del tipo che incapsula
Le classi wrapper sono state costruite per essere immutabili: assumono un valore al momento della creazione e non lo cambieranno mai più.
Esiste poi un metodo che consente di leggere in modo protetto il valore dello stato.
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 55
Wrapper e classi di servizioclass ProvaBoxingUnboxingImpliciti {
public static void main(String[] args) {
Integer x = 4; // boxing implicito (autoboxing)
int xint = x; // unboxing implicito
System.out.println(x * xint);
}
}
Le classi Wrapper non inglobano solamente un tipo primitivo. Esse metto anche a disposizione metodi per gestire tali tipi primitivi. Tra gli altri:
public static int parseInt(String s)
public static double doubleValue()
Esso permette di convertire una stringa in un intero. Se non riesce lancia un’eccezione. (Vedremo poi nelle prossime lezioni cosa questo significa…)
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 56
Modificatori in Java
I modificatori sono parole riservate che forniscono al compilatore informazioni sulla natura del codice
I modificatori di accesso regolano la possibilità di accedere ad una Classe, ad un metodo o ad un attributo
Le variabili dichiarate in un metodo non hanno modificatori di accesso, d'altra parte esse sono visibili solo all'interno del metodo stesso
11/03/2010 57Università di Camerino - Scuola di Scienze e Tecnologie
Modificatori in JavaModificatore Classe Attributo Metodo Costruttore Blocco codice
public Si Si Si Si No
protected No Si Si Si No
(default) Si Si Si Si Si
private No Si Si Si No
abstract Si No Si No No
final Si Si Si No No
native No No Si No No
static No Si Si No Si
synchonized No No Si No No
transient No Si No No No
volatile No Si No No No
11/03/2010 58Università di Camerino - Scuola di Scienze e Tecnologie
Modificatori di accesso
Modificatore Stessa Classe Stesso package Sottoclasse dappertutto
public Si Si Si Si
protected Si Si Si No
(default) Si Si No No
private Si No No No
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 59
La tabella definisce la visibilità garantita dai modificatori di accesso nei diversi scenari proposti
Classi di Servizio
Le classi wrapper mettono a disposizione un gran numero di metodi static
Queste funzionalità sono quindi legate all’idea di classe come fornitore di servizi, indipendentemente dalla creazione di istanze.
Nel caso di classi che presentano solo metodi statici da utilizzare si parla di classi di servizio
Ne abbiamo un esempio con la classe Math…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 60
Math
È una classe che mette a disposizione funzioni matematiche: Potenze radici: pow() e sqrt()
Funzioni trigonometriche: sin(), cos(), tan() …
Logaritmo naturale ed esponenziale: log(), exp()
Funzioni di conversione da reali a interi: round()
Varie ed eventuali: abs(), max() …
Tutti questi metodi sono pubblici e statici per cui possono essere usati liberamente dal programmatore!
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 61
Math - esempioclass EsempioMath {
public static void main(String args[]){
double x,y;
x = 5;
y = Math.log(x);
System.out.println(“Il logaritmo di “+x+” è “+y);
x = Math.PI / 2; // Pi greco/2
y = Math.sin(x);
System.out.println(“Il seno di “+x+” è “+y);
}
}
Essendo una classe contenuta in java.lang è direttamente disponibile senza necessità di import! Osservate l’esempio qui sopra…
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 62
Costanti
Le costanti possono essere pensate come dei nomi a cui è associato un valore
Tale associazione rimane valida per tutta la vita della costante e non cambia mai
In genere, per convenzione, le costanti sono scritte tutte maiuscole e si usa l’underscore come separatore
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 63
Costanti
In Java una costante si dichiara usando i modificatori final. Una volta inizializzata non può essere modificata!
Al fine di rendere disponibile la costante a tutta la classe possiamo pensare di associare le costanti direttamente alla classe tramite il modificatore static
Le variabili istanza static fanno parte della definizione della classe stessa
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 64
Costanti
Esiste una sola copia di una variabile istanza static di una classe e si riferisce all’intera classe
Per riferirla e/o modificarla si usa la notazione: nomeClasse.nomeVariabile
Una possibile dichiarazione di costante in Java sarà allora: public static final int GIORNI_ANNO = 365;
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 65
Costanti
Le costanti sono tipiche delle classi di servizio. La classe Math mette a disposizione per esempio:
public static final double E
public static final double PI
Rispettivamente il numero di Nepero e il pi greco
Anche i wrapper mettono a disposizione costanti. Ad esempio il wrapper Integer ha il massimo e il minimo intero rappresentabile:
public static final int MAX_VALUE
public static final int MIN_VALUE
11/03/2010 Università di Camerino - Scuola di Scienze e Tecnologie 66
Sequenze di escapeSequenza Effetto
\n A capo
\t Tab, tabulazione
\b Backspace, cancella a sinistra
\r Return, rappresenta l’invio
\f Form feed
\\ È il backslash \
\’ Apice
\” Virgolette
\d carattere rappresentato in base ottale (es. A corrisponde a \101)
\xd carattere rappresentato in esadecimale (es. A corrisponde a \42)
\ud carattere rappresentato unicode
11/03/2010 67Università di Camerino - Scuola di Scienze e Tecnologie
top related