dott. federico buti - unicam · raggruppare parti di codice, svolgendo la funzione di “segni di...

67
[email protected] Scuola di Scienze e Tecnologie Appunti del corso Dott. Federico Buti

Upload: vandung

Post on 16-Feb-2019

227 views

Category:

Documents


0 download

TRANSCRIPT

[email protected] di Scienze e Tecnologie

Appunti del corso

Dott. Federico Buti

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