DAIS – Univ. Ca' Foscari Venezia
Programmazione
ad oggetti
Samuel Rota Bulò
Informazioni generali
●
Docente:
Samuel Rota Bulò
●
@email:
[email protected]
●
Homepage:
http://www.dais.unive.it/~srotabul/
ooprogramming2012.html
●
Ricevimento:
da concordare previa email
●
Durata:
30 ore
●
Lezioni:
mercoledì 18:15 - 19:45
sabato
08:45 – 10:15
●
Esame:
scritto + laboratorio + progetto
Libro di testo
Il linguaggio
JAVA
Un po' di storia
●
●
●
●
●
●
●
●
●
●
●
1991: nasce alla Sun Microsystems con il nome “green” per
utilizzarlo in elettrodomestici.
1994: l'ideatore di “green” si rende conto che il nuovo
linguaggio poteva avere grosse potenzialità per applicazioni
client/server.
1995: nasce ufficialmente Java
1996: v1.0
1997: v1.1, classi innestate
1998: v1.2, swing e collections
2000: v1.3, miglioramento delle prestazioni
2002: v1.4, asserzioni, XML
2004: v5.0, classi generiche, estensione ciclo for, autoincapsulamento, enumerazioni
2006: v6.0, miglioramento della libreria
2010: v7.0, piccole modifiche al linguaggio e miglioramento
libreria
Caratteristiche di Java
●
●
●
●
●
●
●
Alto livello: assenza di puntatori e gestione esplicita
della memoria
Imperativo: sequenza di istruzioni che modificano la
memoria
Ad oggetti: ogni cosa in Java è un oggetto (salvo
piccole eccezioni)
Portabile: bytecode eseguibile su Java Virtual Machine
(JVM)
Fortemente tipato: controllo forte dei tipi da parte
del compilatore
Sicuro: progettato per eseguire codice remotamente in
modo sicuro
Vivo: in continua evoluzione
La piattaforma Java
Dal sorgente all'esecuzione
Macchina Hardware X
Sorgente
programma
JAVA
Compilatore
JAVA
Bytecode
programma
JAVA
Macchina
Virtuale
JAVA
Bytecode
librerie
JAVA
Esecuzione
programma
Macchina Hardware Y
Java Virtual Machine (JVM)
●
Macchina astratta:
–
Esegue codice intermedio (bytecode)
–
Specifica indipendente dall'architettura sottostante
●
Indipendente del sistema operativo
●
Esistono diverse implementazioni
●
Componenti:
–
–
–
Class loader: carica in memoria le classi necessarie al
programma
Bytecode verifier: controlla l'integrità degli accessi in
memoria e l'aderenza alla specifica della JVM, ...
Security manager: verifica la sicurezza delle classi caricate
a runtime, controlla gli accessi ai file, ...
Interpreter
Class Loader
JVM
Bytecode verifier
Security manager
Hello world !
HelloWorld.java:
public class HelloWorld {
public static void main(String[] args){
//stampa in console un messaggio
System.out.println(“Hello, World !”);
}
}
●
●
●
Compilazione: javac HelloWorld
–
questo genera il bytecode HelloWorld.class
Esecuzione su JVM: java HelloWorld
Output: Hello, World!
Tipi e variabili
●
●
●
●
●
Ogni valore nel linguaggio ha un tipo
Il tipo identifica un insieme di valori e quali
operazioni sono legali sugli stessi.
Una variabile è una porzione di memoria del calcolatore
caratterizzata da un tipo, un nome e un valore
contenuto.
Una variabile di tipo X può assumere solo valori di
tipo X.
Una variabile viene dichiarata con:
nomeTipo nomeVariabile;
nomeTipo nomeVariabile = valore;
●
Esempi:
String greetings = “Hello, World!”;
PrintStream printer = System.out;
int width = 20;
L'operatore di assegnamento
●
●
Abbiamo visto che possiamo assegnare valori alle
variabili in fase di dichiarazione
Mediante l'operatore = possiamo assegnare un nuovo
valore ad una variabile
nomeVariabile = valore;
●
●
●
Una variabile non può essere utilizzata se non viene
prima assegnato un valore
Il valore può essere il risultato di un espressione.
Es:
int width = 10;
int height; height = 3;
width = height + 10; // width=13
height = height + 1; // height=4
Oggetti e classi
●
●
●
●
Una classe è la descrizione di una struttura dati
complessa caratterizzata principalmente da:
– campi: variabili che conterranno i dati
– metodi: operazioni che agiscono sui dati
Un oggetto è un'istanza di una certa classe, in cui i
campi assumono valori ed è manipolabile attraverso
l'invocazione dei metodi descritti nella classe.
La classe rappresenta il tipo di un oggetto.
In Java ogni cosa è un oggetto (salvo piccole
eccezioni).
Esempio di oggetti
●
●
●
Oggetti appartenenti alla stessa classe condividono gli
stessi nomi e gli stessi tipi per i propri campi e lo
stesso codice dei metodi.
Oggetti distinti, anche se appartenenti alla stessa
classe, occupano celle di memoria distinte per
memorizzare i valori dei propri campi.
Ogni oggetto ha una copia privata dei suoi campi.
String
String
data=”Hello”
data=”Pippo”
length(...)
toUpperCase(...)
length(...)
toUpperCase(...)
Nota sugli identificatori
●
●
I nomi di variabili, metodi, classi devono seguire
determinate regole per non incorrere in errori di
compilazione:
– possono essere composti di lettere, cifre, $, _, ma non
possono iniziare con una cifra
– non si possono usare simboli come ?, % o spazi
– non si possono usare parole riservate del linguaggio come
public, class, int, …
Esistono poi delle convenzioni sugli identificatori:
– le variabili e metodi iniziano con una lettera minuscola
– se vogliamo usare parole multiple per un identificatore le
separiamo usando le lettere iniziali maiuscole.
Es: lunghezzaParola
– le classi iniziano con una lettera maiuscola
Utilizzo di oggetti
●
●
●
Consideriamo la classe Rectangle presente nella
libreria java.awt di Java.
La classe Rectangle descrive i campi necessari per
modellare un rettangolo (x,y,altezza,larghezza) e i
metodi per manipolarlo.
Un oggetto di tipo Rectangle rappresenta una specifica
istanza di rettangolo (es: x=5, y=10, larghezza=20,
altezza=30)
(x,y)
Rectangle
x=5
y=10
width=20
height=30
height
...
width
Costruttori
●
●
●
Il costruttore è un metodo speciale che consente di
allocare ed inizializzare un nuovo oggetto.
– il nome del costruttore coincide con il nome della
classe
– può avere o meno dei parametri associati che servono
a determinare l'inizializzazione dell'oggetto
I costruttori vengono descritti all'interno delle
classi.
Un costruttore viene invocato con new e ritorna un
riferimento all'oggetto costruito.
new NomeClasse(parametri)
●
Esempio:
Rectangle box = new Rectangle(5,10,20,30);
Costruttori
●
●
●
Una classe può fornire più di un costruttore
In questo modo abbiamo diverse modalità con cui
possiamo costruire un oggetto sulla base delle
parametrizzazioni del costruttore
Esempio:
Rectangle box = new Rectangle(5,10,20,30);
Rectangle box2 = new Rectangle();
●
Il costruttore Rectangle() inizializza i campi
dell'oggetto a 0.
Metodi
●
●
●
I metodi descrivono le operazioni che possono essere usate
per manipolare gli oggetti
L'implementazione e la firma dei metodi è descritta nella
classe
Il metodo agisce esclusivamente sui campi dell'oggetto che
lo invoca
oggetto.metodo(parametri)
●
●
●
Un metodo può avere dei parametri o meno
Un metodo può ritornare o meno un valore
Es.: il metodo length di String ritorna lunghezza della
stringa su cui viene invocato
String greetings = “Hello, world!”;
String greetings2 = “Ciao”;
int n1 = greetings.length(); // n1=13
int n2 = greetings2.length(); // n2=4
Metodi
●
●
●
●
I metodi possono accedere ai campi dell'oggetto in
lettura o scrittura a seconda dell'operazione che
vogliamo svolgere.
I metodi che ritornano il valore di un campo per
convenzione hanno un nome del tipo getNomeCampo. Es:
getX(), getY().
I metodi che modificano direttamente il valore di un
campo per convenziona hanno un nome del tipo
setNomeCampo. Es: setX(10), setY(30).
Metodi che modificano il valore di uno o più campi di
un oggetto si dicono con “side effects” o “mutators”.
Rectangle box = new Rectangle();
box.setWidth(10); box.setHeight(20);
box.translate(5,10); // x=x+5, y=y+10
System.out.println(box.getX()); //stampa 5
Variabili di tipo oggetto e primitive
●
●
●
●
●
●
Le variabili di tipo oggetto, se inizializzate,
memorizzano la posizione di un oggetto in memoria
(riferimento all'oggetto) o null (riferimento nullo).
Tutti gli oggetti vengono memorizzati nello heap.
Il costrutto new, usato per creare un oggetto, ritorna
un riferimento al nuovo oggetto creato.
Diverse variabili di tipo oggetto possono condividere
un riferimento ad uno stesso oggetto.
In Java non abbiamo esclusivamente oggetti, ma
lavoriamo anche con valori di tipo primitivo (numeri
interi, virgola mobile, booleani, caratteri).
In questo caso la variabile contiene un valore del loro
tipo.
Variabili di tipo oggetto e primitive
Rectangle box1 = new Rectangle (0,0,10,10);
Rectangle box2 = box1; Rectangle box3 = null;
box1.setX(2);
System.out.println(box2.getX()); //stampa 2 e non 0
int width = 10;
int height = width;
height = 2;
System.out.println(width); //stampa 10
box3.setY(0); //errore a run­time
box1=
box2=
box3=
width=
height=
Rectangle
null
x=0
y=0
width=10
height=10
10
10
...
Main
●
●
●
●
Un programma è composto da più classi
La classe applicazione è quella che ha il metodo
statico main, da cui parte la computazione.
Per eseguire il programma bisogna invocare la virtual
machine passando una classe applicazione (es: java
HelloWorld)
I parametri del main identificano i paramatri passati
all'applicazione in fase di esecuzione
public class HelloWorld {
public static void main(String[] args){
//stampa in console un messaggio
System.out.println(“Hello, World !”);
}
}
Classi di libreria
●
●
●
Il codice Java viene organizzato in librerie (packages)
Un package può essere
– una directory
– un speciale archivio jar
Importiamo una classe specificando i nomi del package e della
classe
import java.awt.Rectangle;
●
●
●
Le classi del package java.lang sono importante in automatico. Ne
fanno parte per esempio String e System.
I package seguono un'organizzazione gerarchica. Possiamo avere
sotto-package di altri package (es: java.awt.event)
Possiamo importare tutte le classi di un package (ma non verranno
inclusi in automatico i sotto-package)
import java.awt.*;
import java.awt.event.*;
Documentazione Java
●
●
●
Le librerie Java sono ben documentate .
La documentazione on-line (javadoc) include una
descrizione dei package e delle relative classi (campi,
metodi e costruttori con accesso non privato)
http://docs.oracle.com/javase/7/docs/api/
Documentazione Java
Documentazione Java
Documentazione Java
Documentazione Java