Sei sulla pagina 1di 17

Politecnico di Milano

Java
un moderno linguaggio orientato agli oggetti pensato per lo sviluppo di applicazioni che devono essere eseguite in un ambiente eterogeneo connesso in rete Caratteristiche principali
Semplice Robusto Architecture neutral Linking dinamico delle classi Sicuro Multithreaded

Introduzione al linguaggio Java

-2-

Ciclo di sviluppo

Librerie principali
Interfacce grafiche Connessione a DB
JDBC AWT e SWING (JFC)

sorgente

nome.java

Class Loader (verificatore di bytecode) Just in Time compiler

Componenti per sviluppo visuale


Java Beans

Multimedia
Java 2D, Java 3D Java Advanced Imaging

compilatore Java Virtual machine bytecode nome.class

Input/Output Networking
socket, datagrammi http, JavaMail oggetti distribuiti: RMI e CORBA Java IDL

Security
Java Cryptography Extension

Sistema Operativo Hardware

...

http://java.sun.com/products/index.html
-3-4-

supporto alla creazione di documentazione


definisce dei costrutti per regolare la scrittura di commenti nel codice viene fornito uno strumento per lestrazione dei commenti e la generazione di pagine HTML

Gli applet

server HTTP

Sort.class Bubble.class Quick.class

-5-

-6-

Politecnico di Milano

Struttura di un programma Java


un programma consiste in un insieme di definizioni di classi in genere ogni classe definita in un file separato (compilabile separatamente dagli altri file) almeno una delle classi che appartengono allapplicazione deve esportare un metodo main lapplicazione viene avviata chiamando linterprete con un parametro che specifica la classe che contiene il metodo main

I costrutti di base

-8-

Un esempio di programma Java


public class Salve { public static void main(String args[]) { for(int i=0; i<10; i++) System.out.println("Salve mondo"); } }

Commenti
// commento fino a fine linea /* commento che pu occupare pi linee */ /** commento su pi linee che viene estratto dallo strumento che genera automaticamente la documentazione*/

nella programmazione in-the-small Java molto simile al C:


struttura a blocchi tipi primitivi visibilit e life-time delle variabili operatori funzioni flusso di controllo
-9-

- 10 -

Tipi primitivi
non sono rappresentati da classi (efficienza) sono allocati staticamente hanno dimensione fissata dalla specifica del linguaggio (portabilit)
boolean char byte 1 16 8 short int long 16 32 64 float double 32 64

Tipi primitivi
no conversione implicita di tipo nei casi in cui ci sia perdita di informazione
int intero; double reale=3.14159; intero=reale; int intero; double reale=3.14159; intero=(int)reale;

NO

non esistono i tipi unsigned e i tipi puntatore a

talvolta pu servire vedere i valori dei tipi primitivi come oggetti: per ogni tipo esiste una classe (detta wrapper)
Boolean, Character, Byte, Short, Integer...

- 11 -

- 12 -

Costanti
parola chiave final
{ final double pi=3.14159; pi+=5; }

funzioni (metodi)
i metodi possono restituire un valore oppure no (in tal caso il tipo di ritorno void) il passaggio dei parametri avviene per valore

NO

int duplica(int x) { int temp; temp=x*2; return temp; }

void stampa(int x) { System.out.println(x); }

- 13 -

- 14 -

Cosa manca in Java rispetto C


preprocessore
#define - in Java si usano le costanti #header file - rendono il codice poco comprensibile

Politecnico di Milano

typedef - in Java si usano le classi struct - in Java si usano le classi union enum - in Java si usano le classi funzioni isolate - in Java ci sono solo metodi goto metodi con numero variabile di parametri puntatori conversione automatica di tipo
- 15 -

Classi ed Oggetti

Creazione degli oggetti


gli oggetti sono manipolati attraverso riferimenti la variabile che identifica un oggetto pu essere vista come un puntatore
dichiarare una variabile non significa creare un oggetto gli oggetti sono tutti costruiti esplicitamente con il comando new (allocazione dinamica)

Creazione degli oggetti


pi riferimenti possono puntare al medesimo oggetto lesistenza di un oggetto non direttamente condizionata dallesistenza dei singoli riferimenti che lo riguardano un riferimento pu puntare a nessun oggetto (il suo valore null) il passaggio di un oggetto come parametro avviene per COPIA DEL RIFERIMENTO - unoperazione poco costosa
- 18 -

String s1, s2; s1=new String("abc"); s2=s1; System.out.println(s1); System.out.println(s2); f(s2); System.out.println(s2);

String s1; int i; s1=new String("abc"); i= s1.length(); System.out.println(i);

si accede agli attributi e si invocano i metodi con la dot notation

void f(String s) { String s3; s3=new String("xyz"); s=s3; }

- 17 -

Distruzione degli oggetti


gli oggetti non vengono mai distrutti esplicitamente dal programmatore il supporto run-time del linguaggio fornisce un garbagecollector che si incarica di liberare la memoria dagli oggetti inutili un oggetto inutile quando non esistono pi riferimenti ad esso (cio non esiste pi la possibilit di invocarne un metodo o accederne gli attributi)
quando si esce dal contesto in cui i riferimenti sono stati creati (variabili locali ad una procedura dopo la terminazione della stessa) quando i riferimenti vengono associati ad altri oggetti o al valore null
- 19 -

Garbage Collector (GC)


un programma Java non controlla direttamente il GC il GC un thread che gira in background ed entra in azione secondo una politica che non conosciuta al programmatore il compito svolto dal GC complesso e quindi inevitabilmente la velocit di esecuzione del programma ne risente

- 20 -

Verificare luguaglianza tra oggetti (1)


ricordarsi sempre che le variabili utilizzate per accedere agli oggetti sono dei riferimenti
String nome1=new String("Rossi"); String nome2=new String("Rossi"); if(nome1==nome2) System.out.println("Uguali!"); else System.out.println("Diversi!");

Verificare luguaglianza tra oggetti (2)


tutti gli oggetti esportano il metodo equals che permette di confrontarli con oggetti della medesima classe da dove arriva? String nome1=new String("Rossi"); String nome2=new String("Rossi"); if(nome1.equals(nome2)) System.out.println("Uguali!"); else System.out.println("Diversi!");

: String Rossi : String Rossi

nome1 nome2
- 21 -

- 22 -

Definizione di una classe


/* Punto piano */ public class Punto { private float x,y; // coordinate cartesiane Punto - float x,y + Punto(float, float) + sposta(float dx, float dy) + String descrizione() public Punto(float coordX, float coordY){ x=coordX; y=coordY; } public void sposta(float dx, float dy){ x+=dx; y+=dy; } public String descrizione(){ return "Punto (" +x+ ", " +y+ ")"; } }
- 23 -

Definizione di una classe


sintatticamente non esiste separazione tra interfaccia ed implementazione attributi e metodi sono visibili in tutta la classe (no notazione punto) inizializzazione degli attributi valore di default (boolean a false, gli int a 0) inizializzazione nella dichiarazione costruttori
/* Punto piano */ public class Punto { private float x=0,y; // coord. cartesiane public Punto(float coordX, float coordY){ x=coordX; y=coordY; } public void sposta(float dx, float dy){ x+=dx; y+=dy; } public String descrizione(){ return "Punto (" +x+ ", " +y+ ")"; } }
- 24 -

Visibilit
classi
public package (non specificato)
/* Punto piano */ public class Punto { private float x,y; // coord. cartesiane public Punto(float coordX, float coordY){ x=coordX; y=coordY; } public void sposta(float dx, float dy){ x+=dx; y+=dy; } public String descrizione(){ return "Punto (" +x+ ", " +y+ ")"; } }
- 25 -

Costruttore
possono essere definiti pi costruttori che si differenziano per tipo e/o numero di parametri per i costruttori non si specifica il tipo del risultato si possono creare oggetti solo se esiste almeno un costruttore loperatore new deve essere invocato con parametri che concordano con quelli specificati da un costruttore se e solo se non viene specificato alcun costruttore il compilatore ne fornisce uno di default (vuoto con nessun parametro) un costruttore pu chiamarne un altro
- 26 -

public class Punto { private float x,y; public Punto() { x=y=0; } public Punto(float coordX, float coordY) { x=coordX; y=coordY; } public Punto(float xy) { this(xy,xy); } }

metodi ed attributi
public private protected package (non specificato)

Esempio di utilizzo della classe Punto


public class Punto { private float x=0,y; // coord. cartesiane public Punto(float coordX, float coordY){ x=coordX; y=coordY; } public void sposta(float dx, float dy){ x+=dx; y+=dy; } public String descrizione(){ return "Punto (" +x+ ", " +y+ ")"; } public static void main(String[] args){ Punto punto=new Punto(7,8); System.out.println(punto.descrizione()); punto.sposta(0,3); System.out.println(punto.descrizione()); } }
- 27 -

Overloading
pi metodi possono avere lo stesso nome ma parametri in numero e/o tipo diversi
public class Punto { private float x,y; // coord. cartesiane public void sposta(float dx, float dy){ x+=dx; y+=dy; } public void sposta(float dxy){ sposta(dxy, dxy); } }
- 28 -

Array (1)
come per gli oggetti, dichiarazione e creazione sono fasi divise la dimensione non pu essere modificata dopo la creazione indici come in C

Array (2)
creare un array di un tipo riferimento non significa creare gli oggetti corrispondenti persone Gigi:Persona Leo:Persona Luca:Persona
Persona[] persone=new Persona[4];

int[] elementi; elementi=new int[10]; for(int i=0; i<10; i++) elementi[i]=i; for(int i=0; i<10; i++){ System.out.println(elementi[i]); }

persone[0]=new Persona(Gigi); persone[1]=new Persona(Leo); persone[2]=new Persona(Luca);


- 29 - 30 -

Array multidimensionali (1)


sono in realt array di array
int i,j; int[][] matrice; matrice=new int[5][5]; for(i=0;i<matrice.length;i++) for(j=0; j<matrice[i].length; j++) matrice[i][j]=i*j; for(i=0;i<matrice.length;i++){ for(j=0; j<matrice[i].length; j++) System.out.print(" "+matrice[i][j]); System.out.println(); }

Array multidimensionali (2)


matrice[0] non necessariamente devono essere rettangolari si possono a piacere aggiungere dimensioni
matrice=new int[5][]; matrice[0]=new int[2]; matrice[1]=new int[4]; matrice[2]=new int[5]; ...

matrice

matrice[4][4]
0 0 0 0 0 0 1 2 3 4 0 2 4 6 8 0 0 3 4 6 8 9 12 12 16

matrice=new int[5][7];

matrice=new int[5][]; for(i=0;i<matrice.length;i++) matrice[i]=new int[7];


- 32 -

- 31 -

Inizializzazione array
possono essere creati ed inizializzati al momento della dichiarazione:

Unalternativa agli array: la classe Vector


Implementa un array di objects La dimensione dellarray cresce dinamicamente import java.util.*; ..... Vector v; v = new Vector(); int i; for(i=0;i<10;i++) v.add(new Integer(i)); /*oppure v.addElement(new Integer(i))*/ for(i=0;i<10;i++) System.out.println(v.get(i)); /*oppure v.elementAt(i)*/ System.out.println("Capacita`: "+v.capacity()+ " Dim: "+v.size()); v.add(new Integer(10)); System.out.println("Capacita`: "+v.capacity()+ " Dim: "+v.size()); Output: prima println: Capacita`: 10 Dim: 10 - 34 seconda println: Capacita`: 20 Dim: 10

int[] vettore ={ 1, 2, 3, 4}; int[][] matrice = { {10, 11, 12, 13}, {14, 15, 16, 17}, {18, 19} };

- 33 -

String (1)
le stringhe sono oggetti, istanze della classe String, e NON array di caratteri (come in C)

String (2)
le costanti letterali stringa sono trasformate dal compilatore in oggetti di classe String
System.out.println("Verdi".length()); String nome="Carlo", cognome; cognome=Rossi;

char caratteri[] = {'C', 'a', 'r', 'l', 'o'}; String nome=new String(caratteri); System.out.println(nome); System.out.println(nome.length());

le stringhe si possono concatenare con loperatore + ed il risultato un nuovo oggetto di classe String
String nome="Carlo"; String cognome="Rossi"; String completo; completo=nome+" "+cognome;
- 36 -

Carlo 5
- 35 -

String (3)
la classe String non esporta alcun metodo per modificare i caratteri che compongono la stringa:

Trasformazione degli oggetti in stringhe


tutti gli oggetti esportano loperazione toString che restituisce una descrizione testuale delloggetto
public static void main(String[] args) { String contenuto; Vector vettoreDinamico=new Vector(); vettoreDinamico.addElement("Carlo"); vettoreDinamico.addElement("Matteo"); vettoreDinamico.addElement("Luca"); vettoreDinamico.addElement("Franco"); contenuto=vettoreDinamico.toString(); System.out.println(contenuto);}

gli oggetti di classe String sono immutabili


le stringhe possono essere facilmente condivise senza rischiare effetti collaterali indesiderati
:Persona :String cdofnc... :ContoCorrente

evitare di creare migliaia di oggetti!


String contenuto; while(libro.fineParole()){ contenuto=contenuto+libro.leggiParola(); }
- 37 -

[Carlo, Matteo, Luca, Franco]


- 38 -

Trasformazione degli oggetti in stringhe


il metodo toString pu essere chiamato anche implicitamente
Vector vettoreDinamico=new Vector(); vettoreDinamico.addElement("Carlo"); vettoreDinamico.addElement("Matteo"); vettoreDinamico.addElement("Luca"); vettoreDinamico.addElement("Franco"); System.out.println("Contenuto del vettore:\n"+vettoreDinamico);

Variabili di classe (static)


variabili associate alla classe e NON agli oggetti quando sono pubblici possono essere letti e scritti senza creare prima una istanza
public class ContoCorrente { private static long contatore=0; private long numero; private long saldo=0; }
- 40 -

ContoCorrente + ContoCorrente() + long numero() + versamento(long cifra) ...

public ContoCorrente() { numero=contatore; contatore++; } long numero(){ return numero; }

Contenuto del vettore: [Carlo, Matteo, Luca, Franco]


- 39 -

Inizializzazione delle variabili static


non possono essere inizializzate da un costruttore, quindi:
inizializzazione con dichiarazione (caso precedente) blocco di inizializzazione statico
public class Matrice { private static int[][] ident=new int[10][10]; static{ for(int i=0;i<ident.length;i++) for(int j=0; j<ident[i].length; j++) if(i==j) ident[i][j]=1; else ident[i][j]=0; } ... }
- 41 -

Metodi static
Metodi associati alla classe e non allistanza quando sono pubblici possono essere invocati senza creare prima una istanza Esempi:
main per inizializzare attributi statici o per fornirne il valore metodi di conversione da tipi base a stringa (in String)
public static String valueOf(double d)

ordine di valutazione

funzioni di utilit (in System)

public static void exit(double d)

un metodo statico pu accedere solo ad attributi e metodi statici!


- 42 -

System.out.println
System una classe out un attributo statico della classe System di tipo PrintStream e rappresenta lo standard output PrintStream esporta i metodi per scrivere sullo standard output, tra cui:
print(int) print(long) print(Object) print(String) println(String)

Autoriferimento
il codice che implementa i metodi di una classe quando eseguito si riferisce implicitamente alloggetto su cui il metodo stato invocato (oggetto corrente) il codice pu riferirsi esplicitamente alloggetto corrente attraverso la variabile implicita this
public class Persona { public String nome; public int anni; public String codiceFiscale; public Persona(String nomePersona){ this.nome=nomePersona; } }

- 43 -

- 44 -

Autoriferimento - quando serve?


per differenziare attributi e parametri
public Persona(String nome){ this.nome=nome; }

Politecnico di Milano

per restituire un riferimento alloggetto corrente


StringBuffer s=new StringBuffer(); s.append("uno ").append("due ").append(3); //impl. Di append StringBuffer append (StringBuffer s) { return this; }

Ereditariet

per controllare se un parametro corrisponde alloggetto corrente in un costruttore per richiamare un altro dei costruttori delloggetto - 45 -

Ereditariet Si dichiara una classe come sottoclasse di unaltra mediante la parola chiave "extends" In mancanza di indicazioni specifiche, il compilatore assume che la classe derivi direttamente da Object Ereditariet multipla
non permessa tra classi realizzata tramite interfacce

Ereditariet : un esempio (1)


class MezzoDiTrasporto { int velocitaMassima; int numeroPasseggeri; } class Autoveicolo extends MezzoDiTrasporto { String tipoDiMotore; int potenza; }
- 48 -

- 47 -

Ereditariet: un esempio (2)

Inizializzazione
I costruttori non vengono ereditati Il costruttore di una sottoclasse deve chiamare quello della superclasse tramite il metodo super
la chiamata a super deve essere la prima istruzione del costruttore

class Furgone extends Autoveicolo { int portata; String datiTecnici() { return " portata = " + portata + " potenza = " + potenza + " velocit = " + velocitaMassima; } }

Se la superclasse non ha un costruttore senza parametri, obbligatorio definire un costruttore nella sottoclasse

- 49 -

- 50 -

Costruttori
class MezzoDiTrasporto { int velocitaMassima; int numeroPasseggeri; MezzoDiTrasporto (int velocitaMassima, int numeroPasseggeri) { this.velocitaMassima = velocitaMassima; this.numeroPasseggeri = numeroPasseggeri; } }

Costruttori
class Autovettura extends MezzoDiTrasporto { String tipoDiMotore; int potenza; Autovettura (int velocitaMassima, int numeroPasseggeri, int potenza) { super(velocitaMassima, numeroPasseggeri); this.potenza = potenza; } }
- 52 -

- 51 -

Costruttori
class Furgone extends Autovettura { int portata; Furgone (int velocitaMassima, int potenza, int portata) { super (velocitaMassima, 2, potenza); this.portata = portata; } } 2 1 3

Costruttori In ordine vengono effettuate le inizializzazioni:


costruttore delle classi padre inizializzazione campi locali esecuzione resto del codice del costruttore
class Furgone extends Autoveicolo { int portata; Motore = new Motore(); Furgone (int velMax, int pot, int port) { super (velMax, 2, pot); portata = port; } }
- 54 -

- 53 -

Metodi e classi astratte


Metodi astratti: rappresentano funzionalit che logicamente devono essere presenti in una classe ma che non possono essere implementati Identificati dalla parola chiave abstract Classi astratte: hanno almeno un metodo astratto
Posso dichiarare riferimenti di una classe astratta NON posso creare istanze ( new MyAbstactClass() ) Posso chiamare i metodi ed accedere ai campi di una classe astratta Posso utilizzarle come parametri o valori di ritorno di metodi

Classi astratte: un esempio


abstract class Figura{ private String colore; Figura(String col) { colore = col; } String mioColore() { return colore; } abstract double area(); }

- 55 -

- 56 -

Polimorfismo e binding dinamico


Figura colore mioColore() area() Rettangolo base altezza area() Cerchio raggio

Polimorfismo e binding dinamico

area()

class GestioneFigure { public static void stampaArea(Figura fig) { System.out.println(" area = " + fig.area() ); } public static void main (String args[ ]) { Cerchio cerc = new Cerchio("Giallo", 5); stampaArea(cerc); Rettangolo rett = new Rettangolo("Giallo", 4, 8); stampaArea(rett); } }

- 57 -

- 58 -

Clausola final
I metodi final non possono essere ridefiniti in una sottoclasse Le classi final non possono essere pi essere estese La clausola final per i metodi e per le classi serve per limitare lereditariet NB: le propriet final sono delle costanti

Uso del final: esempio

abstract class Figura{ private String colore; Figura(String col) { colore = col; } final String mioColore() { return colore; } abstract void stampati(); }

final class Quadrato extends Rettangolo { Quadrato(String col, double lato) { super(col, lato, lato); } }

- 59 -

- 60 -

Ereditariet e visibilit degli attributi Ereditariet visibilit delle superclassi


Quattro livelli di visibilit:
public: accessibile a tutti private: visibile solo nella stessa classe a livello di package (non viene specificato niente): visibile a tutti i membri dello stesso package protected: visibile nelle sottoclassi

Politecnico di Milano

Interfacce

class MezzoDiTrasporto { protected int velocitaMassima; protected int numeroPasseggeri;} class Autoveicolo extends MezzoDiTrasporto { protected String tipoDiMotore; protected int potenza; public String toString() { System.out.println(velocita massima: +velocitaMassima); System.out.println(potenza: +potenza);} NB: molto meglio definire un toString opportuno in MezzoDiTrasporto - 61 e usarlo in Autoveicolo

Interfacce
Uninterfaccia una collezione di metodi - privi di implementazione - e di costanti
E` come una classe in cui tutti i metodi sono astratti
}

Interfacce: un esempio
interface strumenti { String descrizione = "strumento musicale"; // valore implicitamente static e final void suona() ; // notare lassenza della implementazione

Se una classe implementa una data interfaccia, il compilatore verifica che nella classe esistano le definizioni per tutti metodi definiti nellinterfaccia

class flauto implements strumenti { public void suona() { System.out.println(" fiuuuuuuu "); } public String descrizione() { return descrizione + flauto"; }

- 63 -

- 64 -

Ereditariet multipla tramite le interfacce


Interfaccia definita nella libreria standard di Java che deve essere implementata dalle classi che consentono luso della clone
Prodotto prezzo Strumenti suona Cloneable

<<implements>> Pianoforte

<<implements>>

- 65 -