Java 2013
-
Upload
giuseppe-guida -
Category
Documents
-
view
37 -
download
0
description
Transcript of Java 2013
-
1
Elementi di Programmazione in Java
-
2
Riferimenti
Bruce Eckel, Thinking in Java, Apogeo
http://mindview.net/Books/TIJ4
Deitel & Deitel (Fondamenti e Avanzate)
Dispense del corso
-
Motivazioni
Il linguaggio Java, pi di C++, il linguaggio OO ad alta diffusione sul quale pi facile vedere
rispecchiati i principi di modellazione e progettazione
di UML
In particolare, la maggior parte dei Design Patterns risolvono problemi formulati per il linguaggio Java
Il linguaggio Java tra i pi utilizzati in questi anni
Lesecutore Java di libero utilizzo
Un notevole quantitativo di strumenti a supporto dello sviluppo di software in Java di libero utilizzo
(spesso anche open source)
3
-
Alcuni contesti di utilizzo di Java
Desktop applications
Sistemi Distribuiti
Mobile
Embedded
4
-
Che Cos Java
un linguaggio (e relativo ambiente di programmazione) definito dalla Sun Microsystems
per permettere lo sviluppo di applicazioni sicure, performanti e robuste su piattaforme multiple, in reti
eterogenee e distribuite (Internet).
7
-
Java: Semplice e O.O.
Sintassi simile a C e C++ (facile da imparare)
Elimina i costrutti pi "pericolosi" di C e C++
aritmetica dei puntatori
(de)allocazione esplicita della memoria
strutture (struct)
definizione di tipi (typedef)
preprocessore (#define)
Aggiunge garbage collection automatica
Conserva la tecnologia OO di base di C++
Rivisita C++ in alcuni aspetti (++ -- ==)
8
-
Java un linguaggio per il quale necessaria sia una compilazione che una interpretazione.
Il codice sorgente Java viene compilato producendo un codice di tipo intermedio per una Java Virtual Machine, detto bytecode.
Il bytecode viene interpretato dalla Java Virtual Machine
Java Compilato e Interpretato
codice sorgente
byte code compilatore interprete
9
-
Il byte-code indipendente dallarchitettura hardware
(ANDF: Architecture Neutral Distribution Format)
Implementazioni della Java Virtual Machine per tantissime macchine e sistemi operativi sono realizzate e distribuite liberamente da Sun-
Oracle
Tramite la Java Virtual Machine si realizza unastrazione di una macchina virtuale allinterno della macchina reale, in grado di interpretare ed eseguire codice bytecode
Il bytecode pu essere eseguito su
qualsiasi sistema provvisto della
propria JVM.
La Java Virtual Machine (JVM)
10
-
Portabilit: C++ vs Java
In Java il compilatore e il bytecode sono unici, e non dipendono dalla macchina (n dal sistema operativo)
11
-
Caratteristiche di Java Semplice da imparare
Per Java sono disponibili:
potenti librerie free e open source,
strumenti di sviluppo adeguati.
Indipendente dallarchitettura e portabile
Nasce per poter essere eseguito in ambiente Web
Avendo a disposizione una JVM, pu essere eseguito su qualsiasi sistema
Dinamico
Grazie allinterpretazione, tutte le classi sono caricate in memoria solo quando servono
Orientato allo sviluppo di software distribuito
Si presta nativamente ad una possibile esecuzione in ambiente distribuito, nel quale le classi si vengano a trovare su diverse macchine fisiche
Il primo importante utilizzo di Java fu costituito dalle Applet
Lambiente run-time incorpora funzioni di rete (sia di basso livello: TCP/IP, che di alto livello: HTTP, )
La rete facilmente accessibile (come i file locali) 12
-
Caratteristiche di Java
Sicuro
Vari meccanismi di sicurezza per la protezione del codice e dei dati da intrusioni di altri processi in esecuzione
Ci che importante non da dove provenga il bytecode, ma cosa effettivamente fa.
il bytecode viene verificato prima dellinterpretazione (theorem prover), in modo da essere certi di alcune sue caratteristiche
assicura che i bytecode non perdano puntatori, violano restrizioni di accesso, o accedano ad oggetti usando un tipo incorretto di informazione.
Se il Verifier scopre un problema con un class file, lancia uneccezione, il caricamento cessa, ed il class file non sar mai eseguito.
Il processo di verifica, insieme alle funzionalit di sicurezza entro il linguaggio e controlli a runtime, aiutano a stabilire un insieme basilare
di garanzie di sicurezza.
gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dellinterprete
13
-
Caratteristiche di Java
Sicuro
Vari meccanismi di sicurezza per la protezione del codice e dei dati da intrusioni di altri processi in esecuzione
Ci che importante non da dove provenga il bytecode, ma cosa effettivamente fa.
il bytecode viene verificato prima dellinterpretazione (theorem prover), in modo da essere certi di alcune sue caratteristiche
assicura che i bytecode non perdano puntatori, violano restrizioni di accesso, o accedano ad oggetti usando un tipo incorretto di informazione.
Se il Verifier scopre un problema con un class file, lancia uneccezione, il caricamento cessa, ed il class file non sar mai eseguito.
Il processo di verifica, insieme alle funzionalit di sicurezza entro il linguaggio e controlli a runtime, aiutano a stabilire un insieme basilare
di garanzie di sicurezza.
gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dellinterprete
14
-
Caratteristiche di Java
Prestazioni
La verifica del bytecode permette di saltare molti controlli a run-time: linterprete pertanto efficiente
Per maggiore efficienza, possibilit di compilazione on-the-fly del bytecode in codice macchina
Esistenza di potenti librerie standard
La sua natura free ha reso possibile lo sviluppo, la diffusione e la standardizzazione della maggior parte delle sue librerie principali
Ad esempio, le librerie AWT e Swing per linterfaccia utente
Multithreaded
E nativamente possibile scrivere programmi concorrenti (multithread) per la JVM
15
-
COMPILAZIONE ON-THE-FLY
16
-
Installazione di Java
17
Tutte le istruzioni necessarie si trovano su
http://www.oracle.com/technetwork/java/javase/downloads/
index.html
JDK (Java Development Kit) contiene la macchina virtuale, tutte le librerie, la documentazione e tutto ci
che pu essere utile per lo sviluppo di applicazioni
Java
JRE (Java Runtime Environment) contiene il minimo di strumenti necessari per poter eseguire un
programma Java
Per quanto esistano strumenti autoinstallanti, sufficiente copiare tutto il materiale scaricato in una cartella ed
eventualmente configurare opportunamente le variabili di
ambiente.
-
Ambienti di sviluppo
Non necessario alcuno strumento particolare non contenuto nella JDK per poter eseguire un programma Java I nostri primi esempi mostreranno come sia possibile compilare ed
eseguire un qualsiasi programma Java facendo solo uso di istruzioni a linea di comando, in ogni sistema operativo
Numerosi ambienti di sviluppo (IDE) sono disponibili per i programmatori Java. In particolare: NetBeans, JDeveloper: gratuiti, direttamente sviluppato da Sun-
Oracle.
Eclipse, gratuito, acquisito da qualche anno da IBM.
Tutti gli ambienti sono ulteriormente arricchiti da moltissime estensioni (plug-in) sviluppate da terze parti e, generalmente, gratuite Utilizzeremo diverse estensioni per risolvere problemi di
modellazione, analisi, testing.
18
-
Lambiente Java
19
Organizzazione dei Programmi Java
-
Standard di Organizzazione dei
Programmi in Java
Ogni classe implementata nel proprio file sorgente (source file).
Includere una classe per file:
Il nome del file Java uguale al nome della classe.
Le applicazioni Java devono includere una classe (quindi un file) con un metodo main:
public static void main(String args[])
20
-
Struttura di un semplice programma Java:
Hello, World
public class Hello{
public static void main(String args[])
{
System.out.println("Hello, World!");
}
}
Tutto deve trovarsi in una classe.
Il codice sorgente salvato in un file Hello.java.
La classe Hello sembra non ereditare da nessunaltra (in realt eredit come default da Object)
21
-
Compilazione ed Esecuzione di Hello,
World
C:\Users\Master\eserciziIS1-2012\java\hello>javac Hello.java
C:\Users\Master\eserciziIS1-2012\java\hello>dir
Il volume nell'unit C non ha etichetta.
Numero di serie del volume: CABC-C76B
Directory di C:\Users\Master\eserciziIS1-2012\java\hello
11/03/2012 10:28 .
11/03/2012 10:28 ..
11/03/2012 10:28 417 Hello.class
11/03/2012 10:20 108 Hello.java
2 File 525 byte
2 Directory 103.298.981.888 byte disponibili
C:\Users\Master\eserciziIS1-2012\java\hello>java Hello
Hello, World!
22
Compilazione
Esecuzione
-
Strumenti fondamentali offerti dalla JDK
Javac.exe il compilatore: trasforma file sorgenti .java in bytecode .class
Java.exe lesecutore (macchina virtuale) esegue una classe specificata a partire dal metodo specificato
Il metodo non era stato specificato poich ce nera uno solo possibile (static)
Hello si riferisce alla classe Hello contenuta in Hello.class, NON a Hello.java
Capiremo meglio in seguito e nelle prossime lezioni, con esempi, i concetti di Metodo e Static.
Il percorso di javac.exe e java.exe pu essere indicato nella variabile dambiente PATH
Set path=%path%;JAVA_HOME\bin
23
-
Commenti in Java
Java supporta 2 stili di commenti.
// Line Comments
/* Block Comments */
24
Tipi primitivi in Java
Tipi scalari:
byte, boolean, char, short, int, long, float, double.
variable_name;
int x;
Nuovi tipi non possono essere creati in Java. C bisogno di creare una classe Java.
In Java gli arrays sono supportati come classi
int[] i = new int[9]
dimensione di un array i.length
-
Classi Java che gestiscono tipi scalari
Da notare che esistono anche delle classi di libreria che sono in grado di wrappare alcuni tipi scalari, con
ulteriori metodi e parametri
Ad esempio la classe Integer
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html
The Integer class wraps a value of the primitive type int in an object.
An object of type Integer contains a single field whose type is int.
The class provides several methods for converting an int to a String and a String to an int, as well as other constants and
methods useful when dealing with an int
25
-
Variabili 1/2
Una variabile deve essere dichiarata,
in Java una dichiarazione di variabile composta da tre parti: modificatore, tipo e identificatore
I modificatori sono opzionali, e sono sostanzialmente stabiliscono laccesso alle variabili. Essi sono:
modificatori di accesso: public, private e protected.
static, synchronized e final.
Lordine con cui vengono messi non importante, anche se bene usare sempre la stessa convenzione, per la
leggibilit del codice.
26
-
Variabili 2/2
Gli identificatori possono essere uno o pi di uno, separati da virgole, e sono i nomi che avranno le variabili.
Esempi:
int X;
int X, Y, Z;
double W = 3.12;
Le variabili devono essere dichiarati allinterno delle classi, le dichiarazioni fatte allesterno sono errate.
Gli oggetti sono variabili in Java e possono essere allocati dinamicamente tramite la parola chiave new
ClassA a = new ClassA();
27
-
Variabili Final 1/3
Le variabili possono essere contrassegnate come costanti (parola chiave final).
Le variabili possono essere inizializzate a tempo di creazione.
Le variabili definite final devono essere inizializzate a
tempo di creazione.
Dichiarare una variabile final vuol dire rendere impossibile la reinizializzazione dopo che la variabile stata
inizializzata con un valore esplicito.
28
-
Variabili Final 2/3
Una volta assegnato un valore iniziale ad una variabile di un tipo primitivo, ad essa non pu essere pi assegnato
alcun valore.
Produce un errore di compilazione:
29
-
Per quanto riguarda invece le variabili reference, la parola chiave final indica che la variabile, dopo essere inizializzata, non pu
essere riassegnata ad un oggetto diverso.
Lo stato delloggetto per potr ancora essere modificato
In questo esempio, loggetto a cui si riferisce la variabile t pu essere modificato, ma quando si tenta di cambiare loggetto a cui si riferisce t, si ottiene un errore di compilazione:
30
Variabili Final 3/3
-
Esempi di dichiarazioni di variabili
int n = 1;
char ch = A;
String s = Hello;
Long L = new Long(100000);
boolean done = false;
final double pi = 3.14159265358979323846;
Employee joe = new Employee();
char [] a = new char[3];
Vector v = new Vector();
31
-
Distruzione degli oggetti (garbage collector)
Gli oggetti vengono liberati assegnando loro il valore null, oppure ci avviene dinamicamente quando sono fuori scope (Garbage collector).
a=null;
In Java non necessario implementare distruttori.
Esiste un meccanismo interno della JVM, chiamato garbage collector che ripulisce la memoria eliminando tutti gli oggetti per i quali non esistano pi riferimenti attivi.
Il garbage collector libera il programmatore dall'eseguire manualmente l'allocazione/deallocazione di memoria.
Sono state ridotte o eliminate in tal modo alcune categorie di bug.
Per le variabili scalari vale la distruzione automatica al termine del loro scope.
32
-
Java Strongly Typed
Java un linguaggio strongly typed.
I tipi scalari NON sono tutti compatibili tra loro.
Lo strong typing riduce molti errori comuni di programmazione.
Le assegnazioni devono essere fatte tra tipi di dati compatibili.
Ci sono cast impliciti tra molti tipi di dati.
possibile definire casting espliciti tra tipi di dati
33
Byte Short
Char
int long float double
Se c un percorso (basta seguire il verso delle frecce) nel grafo viene fatto un casting implicito, ovvero
possibile evitare di scrivere il cast, lo inserire il
compilatore automaticamente.
-
Puntatori e Riferimenti
In Java NON esiste il concetto di puntatore, esiste invece il concetto di Riferimento.
non c bisogno di un simbolo (come &) per specificare un riferimento.
Loperatore new restituisce il riferimento allistanza di un oggetto,
allocato dinamicamente:
Contatore c= new Contatore();
La semplice dichiarazione di un oggetto causa soltanto listanziazione (statica) del riferimento, non delloggetto
Contatore c2;
Un assegnazione come c2=c Corrisponde solo alla realizzazione di un alias: c2 un altro riferimento allo stesso oggetto istanziato con listruzione new
Un riferimento pu essere inizializzato a null per non farlo puntare a nessun oggetto: c2=null;
34
-
Espressioni
Java supporta diversi modi per la costruzione di espressioni (con ordine di precedenza):
++, --, +, -, *,/, %
35
Assegnazioni Le assegnazioni possono essere semplici
x = y
Oppure con I seguenti operatori:
*=, /=, %=, +=, -=, &=, |=, ^=
Unassegnazione tra variabili scalari provoca una copia
int a=10; int b; b=a;
int i = 5;
i += 10; // i = 15
i %= 12; // i = 3
-
Logica Condizionale
La logica condizionale in Java viene eseguita con lo statement if
A differenza di C++ unespressione logica non valuta lo 0 (FALSE) o un non-0 (TRUE), valuta o false o true.
true e false sono valori assunti da variabili di tipo
boolean.
Altri statement condizionali sono: && (And), || (Or), ! (Not), , ==, !=, =, etc.
Java supporta anche costrutti Switch case default
36
-
Operatori di confronto
Tra variabili scalari:
int a=10; int b=10;
(a==b) true
Tra oggetti
String a = pippo; String b pippo;
a.equals(b) true
a==b false
a==b il confronto tra i riferimenti (puntatori) agli oggetti: essendo a e b due oggetti diversi, a==b false
37
-
Looping Constructs
Java supporta tre looping constructs
while, do while, for.
Esempi:
for (int i = 0; i < 10; i++)
{
System.out.println(i);
}
--------------------------------------------------------------------
int i = 0;
while(i < 10)
{
System.out.println(i++); //prints i before
} //applying i++
--------------------------------------------------------------------
int i = 0;
do
{
System.out.println(i++);
} while(i < 10) 38
-
Le Classi in Java
In Java ogni cosa una classe:
Le classi che scriviamo;
Le classi fornite da Java stesso;
Le classi fornite da terzi;
Estensioni Java.
Tutte le classi in Java derivano dalla medesima classe di root detta Object.
Lo capiremo meglio quando tratteremo lereditariet.
Gli oggetti di una classe vengono creati tramite la keyword new.
La keyword new restituisce un riferimento ad un oggetto che
rappresenta unistanza della classe.
Tutte le istanze delle classi sono allocate nellheap del Garbage Collector. 39
-
Metodi I metodi:
sono come le funzioni;
sono definite allinterno della definizione di una classe;
sono visibili a tutti gli altri metodi definiti allinterno della classe; Esempio:
class Arithmetic
{
public int add(int i, int j){
return i + j;
}
public int sub(int i, int j){
return i - j;
}
}
Arithmetic a = new Arithmetic();
System.out.println(a.add(1,2));
System.out.println(a.sub(5,3)); 40
-
Anatomia di un Metodo
Identificatore di visibilit Public: il metodo accessibile ovunque e a tutti. Private: il metodo accessibile solo dagli altri metodi della stessa classe. Protected: Il metodo accessibile unicamente dalle sottoclassi o classi
derivate, in qualsiasi package queste si trovino
Deafult: Il modificatore di default viene assegnato automaticamente dal compilatore solo quando nella scrittura del sorgente si omettono gli altri modificatori. Di default indica che il metodo di accesso pubblico ma solo ed esclusivamente al package della classe dove inserito.
Tipo di ritorno Specifica il tipo di dato che il metodo deve restituire. Utilizzo della keyword return. Utilizzo di void se il metodo non restituisce nessun tipo di dato.
Nome del metodo Lista degli argomenti
Lista dei parametri, ogni parametro identificato dal proprio tipo
Semantica Java
Importante: gli oggetti sono passati per riferimento, tutte le altre variabili come valore. Allo stesso modo se il metodo restituisce un dato questo viene ritornato per valore, in caso di oggetto viene restituito il riferimento. 41
-
Variabili di una Classe (attributi) 1
In Java, possiamo dichiarare variabili che sono globali al relativo oggetto.
Le variabili vengono in genere definite allinizio della classe.
Possono essere definite come Public, Private, Protected, Default.
class Add
{
public int i; // class variable
public int j; // class variable
public int add(){
return i + j;
}
}
Add a = new Add();
a.i=4;
a.j=6;
System.out.println(a.add());
42
-
Variabili di una Classe (attributi) 2
Le variabili di una classe sono definite per ogni istanza di una classe. Per questo motivo ogni oggetto ha la propria
copia della variabile.
Le variabili di una classe possono essere inizializzate. Altrimenti sono settate a 0 o a null.
Le variabili locali (interne ai metodi) devono essere inizializzate prima di essere utilizzate.
Si pu usare la keyword static per far s che un elemento
sia comune a tutte le istanze della classe.
43
-
Esempio
class Incrementor
{
private static int i = 0;
public void incrCount(){
i++;
}
public int getCount() {
return i;
}
}
Incrementor f1, f2;
f1 = new Incrementor();
f2 = new Incrementor();
f1.incrCount();
System.out.println(f1.getC
ount());
f2.incrCount();
System.out.println(f1.getC
ount());
44
1. Qual loutput ? 2. Qual loutput se non avessi utilizzato static?
-
Costanti
In C++ le costanti sono definite utilizzando const o #define.
In Java un poco pi complicato: public final = ;
Esempi: public final static double PI = 3.14;
public final static int NumStudenti = 60;
Le costanti non possono essere modificate.
45
-
Il costruttore
Ogni classe pu avere uno o pi costruttori.
un metodo (non pu essere invocato e non ritorna nulla).
Viene chiamato automaticamente quando si richiede di istanziare loggetto tramite new.
definito con lo stesso nome della classe a cui appartiene.
Viene utilizzato per inizializzare le variabili di una classe.
46
-
I/O
Java supporta un ampio set di librerie di I/O. Network, File, Screen (Terminal, Windows,
Xterm),Screen Layout, Printer.
In Java esiste il concetto di Stream Di caratteri;
Di bytes;
Uno stream un canale di comunicazione tra un programma (Java) e una sorgente (destinazione) da cui importare (verso cui esportare) dati.
Linformazione viene letta (scritta) serialmente, con modalit FIFO
47 Input Output
-
Esempio scrittura su terminale
Per scrivere uno stream su terminale si utilizza: System.out.println();
System.out.print();
Si pu utilizzare il + per concatenare le
stringhe: int i, j;
i = 1;
j = 7;
System.out.println(i = + i + j = + j);
48
-
Esempio con due Classi
49
Le stringhe in java sono degli oggetti della
classe String. Come tutti gli oggetti si creano con
l'operatore new.
cognome=new String(inputCognome);
Esiste anche una variante sintetica per la
creazione di un oggetto String, che quella
utilizzata.
-
Compilazione ed Esecuzione a riga di comando
C:\Users\Master\eserciziIS1-2012\java\esempio1>dir
...
12/03/2012 10:10 .
12/03/2012 10:10 ..
12/03/2012 10:10 487 Agenda.java
12/03/2012 10:01 272 Contatto.java
2 File 759 byte
2 Directory 102.892.392.448 byte disponibili
C:\Users\Master\eserciziIS1-2012\java\esempio1>javac Agenda.java
C:\Users\Master\eserciziIS1-2012\java\esempio1>dir
...
12/03/2012 10:15 .
12/03/2012 10:15 ..
12/03/2012 10:15 931 Agenda.class
12/03/2012 10:10 487 Agenda.java
12/03/2012 10:15 451 Contatto.class
12/03/2012 10:01 272 Contatto.java
4 File 2.141 byte
2 Directory 102.892.384.256 byte disponibili
C:\Users\Master\eserciziIS1-2012\java\esempio1>java Agenda
I contatti presenti in agenda sono:
Rossi 25
Verdi 34
Bianchi 20 50
-
Package 1/2
Un package Java un meccanismo per organizzare classi Java all'interno di sottogruppi ordinati.
Un package un insieme lasco (loose collection) di classi.
I packages sono simili alle librerie.
I programmatori spesso usano i package per riunire classi logicamente correlate o che forniscono servizi simili.
I packages possono essere dichiarati utilizzando la keyword package allinterno di un file .java.
Per utilizzare un package si utilizza la keyword import.
Possono essere memorizzati in file compressi chiamati file JAR, permettendo la trasmissione di pi classi in una sola volta.
Eclipse offre features per la gestione automatica dei Packages.
51
-
Package 2/2
Una applicazione spesso composta di molte classi (eventualmente correlate)
Un package un gruppo di classi che costituiscono una unit concettuale
Un package pu comprendere parecchie classi definite in file separati (file .java e .class)
Una dichiarazione di package ha la forma:
package < nomepackage> ;
se presente, deve essere allinizio del file .java
52
Classe1.java
Classe2.java
-
Package e File System
Esiste una corrispondenza biunivoca fra il nome del package e la posizione nel file system delle classi del package.
Un package di nome esempioIS1 richiede che tutte le sue classi si trovino in una cartella (directory) di nome esempioIS1
Per compilare una classe Classe1 che fa parte di un package esempioIS1 occorre:
porsi nella cartella superiore a esempioIS1 e invocare il
compilatore con il percorso completo della classe:
javac esempioIS1/Classe1.java
Per eseguire una classe Classe2 che fa parte di un package esempioIS1 occorre:
porsi nella cartella superiore a esempioIS1 invocare linterprete
con il nome assoluto della classe:
java esempioIS1/Classe2.java
53
-
Package di default
Se una classe non dichiara di appartenere ad alcun package, automaticamente assegnata al package di
default
Per convenzione, questo package fa riferimento alla cartella (directory) corrente:
lapproccio utilizzato nel primo esempi.
Si possono compilare ed eseguire i file nella cartella in cui si trovano, senza premettere percorsi o nomi assoluti.
54
-
Sub Packages
I Packages in Java sono organizzati gerarchicamente.
I Sub-packages possono essere creati come segue: package mioPackage.Math
package mioPackage.secondoPackage.terzoPackage
Vengono create le due cartelle Math e secondoPackage nella cartella mioPackage.
Viene creata una cartella terzoPackage nella cartella mioPackage/secondoPackage.
55
-
Convenzione sui nomi dei Packages (by Wikipedia)
I Package sono di solito definiti usando una struttura gerarchica, indicando i livelli di gerarchia con dei punti. Anche se i package pi in basso nella gerarchia sono spesso chiamati sotto-package di altri package, non c' nessuna relazione semantica.
Il documento Java Language Specification stabilisce le convenzioni da adottare nei nomi dei package, cos da evitare di pubblicarne due con lo stesso nome. Le convenzioni descrivono come creare nomi unici, in modo da assicurare che package di uso generale e di larga distribuzione non abbiano nomi che possano generare ambiguit.
In generale, un nome comincia con il dominio di primo livello dell'organizzazione che lo produce, seguito dal dominio e da altri eventuali sottodomini, elencati in ordine inverso. L'organizzazione pu infine scegliere un nome specifico per quel particolare package. Inoltre, sempre per convenzione, i nomi dei package dovrebbero contenere solo lettere minuscole.
Ad esempio, se un'organizzazione canadese chiamata MySoft crea un package che si occupa di frazioni, chiamare il package ca.mysoft.fractions lo distingue da un altro package simile creato da un'altra compagnia. Infatti se una compagnia americana omonima crea un package sulle frazioni, ma lo chiama com.mysoft.fractions, le classi nei due package saranno tutte definite in namespace separati ed unici.
Altre convenzioni per evitare le ambiguit e regole per dare nomi ai package quando in dominio Internet non pu essere direttamente usato nel nome sono descritte nella sezione 7.7 della Java Language Specification.
56
-
Accesso ai packages
Per accedere alle classi di un package si pu:
Utilizzare il percorso completo
ClasseA cA = new mioPackage.ClasseA();
possibile utilizzare una scorciatoia per importare classi o packages.
La sintassi per importare classi o packages :
import package1[.package2][].classname;
Esempi:
import mioPackage.ClasseA;
import mioPackage.secondoPackage;
Tutte le classi/packages possono essere importate da un livello pi alto utilizzando la sintassi:
import mioPackage.*;
57
-
Esempi
58
Soluzione 1
Soluzione 2
-
Visibilit di Package
Oltre a pubblico e privato, in Java esiste un altro tipo di visibilit: la visibilit package.
l'impostazione predefinita per classi e metodi, non esiste quindi una parola chiave per indicarla.
Le variabili e i metodi sono accessibili solo per le altre classi dello stesso package in qualunque file siano
definite.
Altre classi, definite in altri package, non possono accedere a variabili e metodi di questo package qualificati
a visibilit package, esattamente come se fossero privati.
59
-
Java Foundation Packages
Java fornisce un gran numero di classi raggruppate in packages diversi in base alle loro funzionalit offerte.
I sei packages di base (foundation packages) offerti da Java sono: java.lang
Contiene le classi per i tipi primitivi, le stringhe, le funzioni matematiche, i threads e le eccezioni.
java.util Contiene classi come vettori, hash tables, date, etc.
java.io Contiene classi per la gestione degli stream di I/O.
java.awt Contiene classi per implementare le GUI
java.net Contiene le classi per il networking
java.applet Contiene le classi per creare e implementare le applets
Il nucleo centrale dal linguaggio Java definito nel package java.lang che importato automaticamente: la frase import java.lang.* sottintesa.
La jdk fornisce pi di 50 packages. 60
-
La Keyword static
Applicato ad un attributo di una classe, indica che
ne esister ununica istanza, comune e
accessibile a tutti gli oggetti di quella classe (gi
lo abbiamo visto).
Applicato ad un metodo di una classe, indica che
tale metodo potr essere richiamato anche senza
bisogno di istanziare un oggetto per quella
classe.
Ad esempio la classe Math contiene metodi
matematici di uso generale
double lato = Math.sqrt(area); 61
-
Static utilizzato gi ma senza saperlo
Il metodo main visto in precedenza static, quindi
pu essere chiamato direttamente anche dalla linea
di comando senza istanziare un oggetto della classe
che lo contiene.
Println un metodo static della classe
Sytem.out di tipo PrintStream (di java.io).
Per questo motivo possiamo invocare
System.out.println(); senza istanziare un oggetto
System.out.
62
-
Esempio
Il metodo StampaAVideoStatic() pu essere
richiamato anche senza instanziare un oggetto della ClasseB;
Per richiamare il metodo StampaAVideoNoStatic()
bisogna necessariamente instanziare un oggetto della ClasseB;
63
-
Eccezioni in breve Uneccezione (exception) un oggetto che descrive una
situazione anomala o di errore.
Leccezioni vengono lanciate (thrown) da una parte di un programma e possono essere raccolte e gestite (handled) da altre parti del programma.
La gestione delle eccezioni permette a uno sviluppatore di suddividere un programma nel normale flusso di esecuzione e in quello di eccezione.
Java ha un insieme predefinito di eccezioni ed errori che possono accadere durante lesecuzione di un programma:
ArithmeticException
ArrayIndexOutOfBoundsException
FileNotFoundException
InstantiationException
Etc 64
-
Eccezioni non gestite
Se uneccezione non gestita da un programma, questo terminer, in maniera non corretta, restituendo un messaggio.
65
-
Gestione delle eccezioni Le istruzioni try catch
Si tenta di eseguire il codice e se si intercetta uneccezione si cerca di porre rimedio.
try {
statement-list1
} catch (exception-class1 variable1){
statement-list2
} catch (exception-class2 variable2) {
statement-list3
} catch .
Listruzione try identifica un blocco distruzioni in cui pu verificarsi uneccezione.
Se uneccezione si solleva nello statement-list1, il controllo trasferito al catch handler appropriato (con la stessa exception class sollevata).
-
Gestire le eccezioni
Se occorre processare leccezione quando essa accade, la linea di codice che lancer leccezione deve essere eseguita in un blocco try.
Un blocco try seguito da 1 o pi clausole catch, che contengono il codice per gestire leccezione.
Ogni clausola catch associata ad un tipo deccezione e viene chiamata exception handler
Quando si solleva uneccezione, la computazione prosegue fino alla prima clausola catch che corrisponde al tipo deccezione sollevata.
Dopo lesecuzione degli statements nella clausola catch, il controllo viene trasferito agli statements che si trovano dopo lintero blocco trycatch.
-
La clausola catch Un blocco try seguito da una o pi clausole catch, che
specificano quali eccezioni vengono gestite
Ogni clausola catch corrisponde a un tipo di eccezione sollevata
Quando si verifica uneccezione, la computazione continua con la prima clausola che corrisponde alleccezione sollevata.
Allinterno di un catch si pu in genere:
Stampare un messaggio dettagliato derrore
Eseguire del codice alternativo: flusso di esecuzione di eccezione
Chiudere il programma
System.exit(error_code);
Ritentare
Eclipse suggerisce e riconosce le exception-class da dover
inserire nel codice, costruendo in maniere automatica i blocchi try catch.
-
Esempio di gestione delleccezione
69
-
La clausola finally
Unistruzione try pu essere seguita da una clausola finally opzionale
Le istruzioni della clausola finally vengono sempre eseguite:
Se non viene sollevata nessuna eccezione, vengono eseguite dopo che si concluso il blocco try
Se si verifica uneccezione, vengono eseguite dopo le istruzioni della clausola catch appropriata
try {
statement-list1
} catch (exception-class1 variable1){
statement-list2
} catch (exception-class2 variable2) {
statement-list2
} catch
} finally {
statement-list3
}
-
Propagazione delle Eccezioni
Normalmente se un metodo main richiama il metodo_1 che richiama il metodo_2 che richiama il metodo_3, il controllo passa dal main al metodo_1 al metodo_2 al metodo_3 e quando questo si conclude ritorna al metodo_2 che a conclusione lo passa al metodo_1 e quindi al main
Se leccezione non viene intercettata e gestita dove si verifica, pu ancora essere trattata a un livello pi alto.
Le eccezioni si propagano attraverso la gerarchia delle chiamate di metodi finch non vengono intercettate e gestite.
-
Esempio Propagazione delle Eccezioni
72
-
Input Stream da terminale Per inserire del testo dalla tastiera in Java non cos
semplice.
Il seguente snippet di codice mostra come inserire una String da tastiera.
73
Import dei packages
gestione delleccezione suggerito in maniera automatica da IDE.
-
E se volessimo inserire altri tipi di valori ?
Ci possono tornare utili le classi per i tipi primitivi.
74
-
Array e Matrici
Gli array in Java si dichiarano con la seguente sintassi: int c[]= new int[12];
Object d[];
d= new Object [100];
Il numero degli elementi non viene mai dichiarato in fase di dichiarazione (a sinistra) ma solo in fase di definizione (a destra)
Sono passati per riferimento public static void main (String args[])
Si pu accedere ad un elemento con la [] c[3]= 4;
Alcuni metodi sono inoltre disponibili c.length
In maniera perfettamente analoga si possono definire e utilizzare le matrici: int m [] []= new int [10] [10];
m[3][5] = 42;
-
Stringhe
In Java le Stringhe NON sono definite come Array di char ma come oggetti della classe String.
Esempi di uso: String s = new String(Hello);
String s = Hello;
String s2 = s1;
Copia solo il riferimento!
String s2=new String(s1);
Copia tutto loggetto
s2 == s1
Vero se si tratta dello STESSO oggetto!
s2.equals(s1)
Vero se si tratta di due stringhe con lo stesso valore
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html
-
Il Collection Framework
Il Collection Framework offerto da Java un'architettura unificata per la rappresentazione e la manipolazione di collezioni di oggetti.
Permette la manipolazione di tali collezioni in maniera indipendente dai dettagli della loro rappresentazione.
Riduce lo sforzo di programmazione, aumentando le prestazioni.
Permette l'interoperabilit tra le API indipendenti, riducendo lo sforzo nella progettazione e nellimparare nuove API,
Promuove il riutilizzo del software.
Il framework si basa su interfacce.
Comprende implementazioni di tali interfacce, e algoritmi di manipolazione.
77
-
Definizioni
Collection: un gruppo (insieme) di oggetti, definiti elementi (elements)
Set: una unordered collection senza duplicati ammessi.
SortedSet: una ordered collection senza duplicati ammessi.
List: una ordered collection, con duplicati ammessi.
Map: una collection che mappa chiavi (keys) a valori (values)
SortedMap: una collection ordinata con chiavi ordinate.
Si noti che esistono due distinte gerarchie di Collection.
78
-
Implementazioni della Collection
La Collection una interfaccia
Ogni tipologia di Collection ha una o pi implementazioni.
Si possono creare nuovi tipi di Collections
Alcune classi che implementano la Collection di Java sono:
79
-
Utilizzare la Collection import java.util.*;
oppure
import java.util.Collection;
Esempio di ArrayList:
import java.util.ArrayList;
private static ArrayList eventsList = new
ArrayList();
Esiste una classe, java.util.Collections; che fornisce un numero di algoritmi da poter utilizzare con le collections, come ad esempio:
sort, binarySearch, copy, shuffle,
reverse, max, min, ... 80
-
Le interfacce di Collection
81
Collection la radice della gerarchia delle collection.
Rappresenta gruppi di oggetti (elementi) che possono essere duplicati oppure no. Alcune possono essere ordinate altre no.
Esistono implementazioni concrete di sottointerfacce quali List e Set.
List rappresenta il concetto di lista ordinata (o sequenza):
gruppo di elementi posti in un qualche ordine;
implementazioni: ArrayList, Vector e LinkedList
Set rappresenta il concetto di insieme: gruppo di elementi
che non contiene duplicati (non contiene e1 e e2 se
e1.equals(e2).
Implementazioni: HashSet.
-
ArrayList vs LinkedList
ArrayList: ottimizzato laccesso casuale (basato su
array), non ottimizzati linserimento e leliminazione allinterno della lista (grosso modo equivalente a Vector)
LinkedList: ottimizzato laccesso sequenziale,
linserimento e leliminazione, indicato per implementare pile(LIFO) e code (FIFO), infatti contiene i metodi: addFirst(), addLast(), getFirst(), getLast(),
removeFirst(), removeLast().
82
-
ArrayList
Abbiamo detto che gli Array non possono cambiare la propria dimensione: il numero di elementi contenuti viene
stabilito al momento della creazione e rimane immutato.
Per superare questa limitazione Java mette a disposizione la classe ArrayList, contenuta nel package java.util
che permette di rappresentare sequenze di oggetti di
lunghezza variabile.
Le istanze di ArrayList possono contenere solo istanze della classe Object.
Ciascun oggetto in unistanza di ArrayList viene
identificato da un numero intero, detto indice, che ne
indica la posizione.
L'accesso ad una posizione inesistente provoca un errore (viene lanciata un'eccezione).
83
-
Costruttori
La classe ArrayList definisce due costruttori:
ArrayList(): crea un vettore vuoto in cui la capacita'
iniziale non specificata (costruttore di default). ArrayList al = new ArrayList();
ArrayList alS = new ArrayList();
ArrayList aall = new
ArrayList();
ArrayList(int initialCapacity): crea un vettore
con la capacit iniziale indicata. ArrayList al = new ArrayList(100);
ArrayList alS = new ArrayList(100);
84
-
Metodi
I metodi definiti dalla classe consentono tra l'altro di:
Leggere o scrivere un elemento in una certa posizione (operazioni analoghe a quelle sugli
array).
Aggiungere uno o pi elementi, in varie posizioni della lista.
Eliminare uno o pi elementi, in varie posizioni della lista.
Cercare un oggetto contenuto nella lista.
Trasformare lArrayList in un array.
85
-
Elenco di metodi -1
86
Restituisce il numero di elementi contenuti nella Lista:
int size()
Restituisce l'elemento di indice index:
Object get(int index)
Sostituisce obj all'oggetto di posizione index:
Object set(int index, Object obj)
Inserisce obj nella posizione index e sposta tutti gli elementi, da index in poi, di una posizione:
void add (int index, Object obj)
Aggiunge obj dopo l'ultimo elemento (restituisce true):
boolean add (Object obj)
-
Elenco di metodi -2
87
Rimuove l'oggetto presente nella posizione index e sposta all'indietro di una posizione tutti gli elementi successivi a
quello rimosso:
void remove(int index)
Rimuove l'oggetto obj se presente restituendo true, oppure restituisce false:
boolean remove(Object obj)
Restituisce la prima posizione dell'oggetto 'elem' nel vettore, -1 se non esiste:
int indexOf(Object elem)
Restituisce una stringa "[el1, el2, eln]:
String toString()
-
Esempio 1/3
88
-
Esempio 2/3
89
-
Esempio 3/3
90
-
JDeveloper
JDeveloper un IDE (Integrated Development Environment).
Pu essere scaricato al seguente indirizzo: http://www.oracle.com/technetwork/developer-
tools/jdev/downloads/index.html
La home page dello strumento: http://www.oracle.com/technetwork/developer-
tools/jdev/overview/index.html
91