2. Breve storia del linguaggio
● Nasce nel 1995 per opera degli ingegneri della
Sun Microsystem
● James Gosling è il team leader del linguaggio
● Attualmente Java è di proprietà di Oracle
Android Corso Base. Maurizio Cozzetto.
4. Caratteristiche del linguaggio
● E' orientato agli oggetti
● E' indipendente dalla piattaforma (portabilità)
● Contiene strumenti e librerie per il networking
● E' progettato per eseguire codice da sorgenti
remote in modo sicuro (applet)
● E' semplice
● E' multithread
● Robusto
Android Corso Base. Maurizio Cozzetto.
5. Sviluppo di un programma Java
Android Corso Base. Maurizio Cozzetto.
6. Esecuzione di un programma Java
Android Corso Base. Maurizio Cozzetto.
12. La memoria
Android Corso Base. Maurizio Cozzetto.
0
1
2
...
...
100
…
…
200
….
...
Locazioni di
memoria
Indirizzi
13. Variabili (1/5)
Android Corso Base. Maurizio Cozzetto.
La variabile è un contenitore di dati
● Variabili di tipo primitivo
● Variabili di tipo riferimento
14. Variabili (2/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo primitivo
100 è l'indirizzo di memoria della variabile
int eta; // Dichiaro eta, eta vale 0
eta = 8; // Assegno a eta il valore 8
eta = eta + 1; // Incremento di 1, quindi eta vale 9
int eta = 8; // Dichiarazione e assegnamento
8eta 100
int
15. Variabili (3/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo riferimento
JButton bottone; // Dichiaro un riferimento (vale null)
bottone null
16. Variabili (4/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo riferimento
JButton bottone; // Dichiaro un riferimento (vale null)
// Creo l'oggetto in memoria e gli assegno un riferimento
bottone = new JButton(“Saluta”);
bottone 200
JButton
Saluta
250
...
200text
x
y
17. Variabili (5/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo riferimento
// Dichiaro il riferimento e creo l'oggetto in memoria con
una sola istruzione
JButton bottone = new JButton(“Saluta”);
18. Riferimenti e puntatori
In Java non esistono puntatori ma riferimenti.
Un riferimento contiene qualcosa del tipo
it.geca.corso.progetto.JButton@558ee9d6
● it.geca.corso.progetto è il package
● JButton è la classe
● 558ee9d6 è l'hashing dell'indirizzo di memoria
Android Corso Base. Maurizio Cozzetto.
558ee9d6
JButton
….
….
bottone
19. Variabili stringa (1/2)
// Creazione usando il costruttore
String nome = new String(“Raffaele”);
Android Corso Base. Maurizio Cozzetto.
String
Raffaele
nome
20. Variabili stringa (2/2)
// Assegnamento “diretto”
String nome = “Raffaele”;
Android Corso Base. Maurizio Cozzetto.
String
Raffaele
nome
21. Variabili data (1/2)
// Creo una data
GregorianCalendar miaDataDiNascita = new
GregorianCalendar(1959, 3, 1);
Android Corso Base. Maurizio Cozzetto.
miaDataDiNascita GregorianCalendar
1959 YEAR
3 MONTH
1 DAY
22. Variabili data (2/2)
// Semplifichiamo la rappresentazione ma non il codice
GregorianCalendar miaDataDiNascita = new
GregorianCalendar(1959, 3, 1);
Android Corso Base. Maurizio Cozzetto.
miaDataDiNascita
GregorianCalendar
1959-3-1
23. Variabili
● Variabili di istanza
● Variabili di classe
● Variabili locali
● Variabili parametro
Android Corso Base. Maurizio Cozzetto.
24. Funzioni (1/2)
● Si chiamano anche metodi
● Definiscono le funzionalità di un oggetto o di un
programma
● Metodi di istanza
● Metodi di classe
Android Corso Base. Maurizio Cozzetto.
26. Regole per il naming
(Camel Notation)
Android Corso Base. Maurizio Cozzetto.
● Iniziale minuscola per le variabiliQualsiasi
● Tutte lettere MAIUSCOLE per le costanti
● Iniziale Maiuscola per le classi
28. int
int parseInt(String s)
Classe Integer
String toBinaryString(int i)
Classi wrapper
...
...
Android Corso Base. Maurizio Cozzetto.
29. Tipi derivati e classi di utilità
Android Corso Base. Maurizio Cozzetto.
● String è una classe per le sequenze di caratteri
● GregorianCalendar è una classe per le date
● JOptionPane è una classe dotata di metodi
statici per la lettura e la stampa dei dati (package
javax)
● System è usata anche per l'output su Console
● Scanner è una classe usata anche per la lettura
dei dati da Console
Demo
30. Controllo del flusso (1/2)
Android Corso Base. Maurizio Cozzetto.
● Struttura di sequenza
● Struttura condizionale
● Con un ramo
● Con due rami
● Struttura switch
31. Controllo del flusso (2/2)
Android Corso Base. Maurizio Cozzetto.
● Cicli
● Ciclo while
● Ciclo do-while
● Ciclo for
● Ciclo infinito
● Ciclo infinito con break
● Ciclo infinito con variabile booleana
35. Struttura condizionale con un ramo in Java
Android Corso Base. Maurizio Cozzetto.
if (<cond>) {
<istruzione1>;
<istruzione2>;
<istruzione3>;
...
}
Demo
37. Struttura condizionale con due rami in Java
Android Corso Base. Maurizio Cozzetto.
if (<cond>) {
<istruzione11>;
<istruzione12>;
<istruzione13>;
...
} else {
<istruzione21>;
<istruzione22>;
...
}
Demo
41. Struttura ciclica do-while in Java
Android Corso Base. Maurizio Cozzetto.
do {
<istruzione1>;
<istruzione2>;
<istruzione3>;
...
} while (<cond>);
Demo
43. Struttura ciclica for in Java (1/2)
Android Corso Base. Maurizio Cozzetto.
for (int i = 0; i < n; i++) { // Esegue i comandi n volte
<istruzione1>;
<istruzione2>;
<istruzione3>;
...
}
Demo
44. Struttura ciclica for in Java (2/2)
Android Corso Base. Maurizio Cozzetto.
i = 0;
while (i < n) {
<istruzione1>;
<istruzione2>;
<istruzione3>;
i++; // Equivale a i = i + 1
}
Demo
48. Struttura ciclica generica (1/2)
Android Corso Base. Maurizio Cozzetto.
while (true) {
<istruzione1>;
if (<cond>)
break; // Salta alla prima istruzione fuori dal ciclo
<istruzione2>;
...
}
Demo
49. Struttura ciclica generica (2/2)
Android Corso Base. Maurizio Cozzetto.
boolean finito = false;
while (!finito) {
<istruzione1>;
if (<cond>)
finito = true;
else {
<istruzione2>;
...
}
}
Demo
50. Array (1/6)
Android Corso Base. Maurizio Cozzetto.
Un array è un oggetto contenitore che mantiene
un numero fisso di elementi tutti dello stesso
tipo (primitivo, derivato o user-defined)
3 0
6 1
-1 2
2 3
6 4
Primo indice
IndiciElemento (alla posizione 3)
5 elementi
51. Array (2/6)
Android Corso Base. Maurizio Cozzetto.
● Dichiarazione
int[] a; // Significa a = null
nulla
52. Array (3/6)
Android Corso Base. Maurizio Cozzetto.
● Allocazione di memoria
a = new int[5]; // Trova lo spazio necessario
int[]
0 0
0 1
0 2
0 3
0 4
a
54. Final e static
● Final denota che “qualcosa” non è
ulteriormente modificabile
- Se applicata ad una classe indica che essa
non è più estendibile
● Static denota “qualcosa” che è invocabile
indipendentemente dall'esistenza di oggetti
istanza della classe
- Il calcolo della radice quadrata di un numero
non dipende da oggetti istanza della classe
Math
- Math.sqrt() è un metodo statico
Android Corso Base. Maurizio Cozzetto.
55. Array (5/6)
Android Corso Base. Maurizio Cozzetto.
final static int MAX = 5;
int[] a = new int[MAX]; // Dichiarazione (allocazione)
// Caricamento dei dati
for (int i = 0; i < a.length; i++) // length numero di elem.
a[i] = 2 * i;
● Dichiarazione e caricamento con un ciclo
56. Array (6/6)
Android Corso Base. Maurizio Cozzetto.
Demo
● Dichiarazione e assegnamento
int[] a = {2,4,6,8,10}; // Attenzione! Non si può “spezzare”
// oppure
// int a[] = new int[]{2,4,6,8,10};
57. Classi (1/5)
● Una classe definisce un tipo (user-defined)
● Esiste un costruttore
- Metodo speciale per allocare gli oggetti
- Non restituisce nessun tipo di ritorno,
neanche void
● Esiste un metodo toString()
Serve a rappresentare l'oggetto in forma
testuale
● E' possibile l'overloading del costruttore
● Esistono altri metodi importanti
- equals()
- clone()
- finalize()
Android Corso Base. Maurizio Cozzetto.
58. Classi (2/5)
Android Corso Base. Maurizio Cozzetto.
Persona
nome: stringa
cognome: stringa
dataNascita: data
cittaResidenza: stringa
Persona()
Persona(nome: stringa, …,
cittaResidenza: stringa)
toString(): stringa
eta(): intero
Nome della classe
Variabili di istanza
Metodi
59. Classi (3/5)
public class Persona {
String nome;
String cognome;
GregorianCalendar dataNascita;
String cittaResidenza;
// costruttore di default
public Persona() {
// una persona “precisa”
}
...
Android Corso Base. Maurizio Cozzetto.
60. Classi (4/5)
// Overloading del costruttore
public Persona(String n, String c, GregorianCalendar d,
String r) {
nome = n;
cognome = c;
dataNascita = d;
cittaResidenza = r;
}
public int eta() {
return (new GregorianCalendar()).get(Calendar.YEAR) -
this.dataNascita.get(Calendar.YEAR);
}
...
Android Corso Base. Maurizio Cozzetto.
61. Classi (5/5)
// Metodo che deriva dalla classe Object
public String toString() {
return cognome + “ “ + nome + “ “ + eta();
}
// Idem
public boolean equals(Persona p) {
// Due persone sono “uguali” quando tutti i dati
// coincidono”
return nome.equals(p.nome) && cognome.equals(...)
&& dataNascita.equals(p.dataNascita) && ...;
}
} // fine classe
Android Corso Base. Maurizio Cozzetto.
62. Oggetti (1/3)
● Un oggetto è un rappresentante della classe
● La creazione avviene mediante il richiamo di un
costruttore
● I valori degli attributi sono tutti inizializzati a 0
se interi, a false se booleani ecc
● I valori degli oggetti attributo della classe sono
inizializzati a null
Android Corso Base. Maurizio Cozzetto.
63. Oggetti (2/3)
// Costruttore di default
Persona raffaeleTomasini = new Persona();
Android Corso Base. Maurizio Cozzetto.
Persona
Raffaele nome
Tomasini cognome
1988-3-17 dataNascita
Brescia cittaResidenza
raffaeleTomasini
64. Oggetti (3/3)
// Uso il costruttore “sovraccaricato”
Persona maurizioCozzetto = new Persona(“Maurizio”,
”Cozzetto”, new GregorianCalendar(1959, Calendar.APRIL, 1),
“Roncadelle”);
Android Corso Base. Maurizio Cozzetto.
Persona
Maurizio nome
Cozzetto cognome
1959-3-1 dataNascita
Roncadelle cittaResidenza
maurizioCozzetto
65. Ereditarietà (1/4)
E' un meccanismo di astrazione che consente
● Il riutilizzo del codice
● La creazione di gerarchie di classi
Android Corso Base. Maurizio Cozzetto.
66. Ereditarietà (2/4)
● Veicolo è detta superclasse e Automobile è
detta classe derivata
● Automobile eredita gli attributi e i metodi della
classe padre (solo attributi e metodi pubblici e
protected)
● La relazione tra Automobile e Veicolo è detta
relazione ISA
Android Corso Base. Maurizio Cozzetto.
67. Ereditarietà (3/4)
public class Veicolo extends Object
{
String targa;
int ruote;
int cilindrata;
String aziendaProduttrice;
String modello;
public String toString()
{
return targa + “ “ + modello;
}
}
Android Corso Base. Maurizio Cozzetto.
68. Ereditarietà (4/4)
public class Automobile extends Veicolo
{
int posti;
int classe; // Rappresenta Euro1, Euro2, Euro3 ...
int potenza;
public double bollo()
{
double d = 0.0;
// Si fanno i calcoli necessari...
return d;
}
}
Android Corso Base. Maurizio Cozzetto.
Demo
69. Override
Consiste nella ridefinizione in una classe derivata
di metodi già definiti nella superclasse
public class Automobile extends Veicolo {
int posti;
// Altre variabili di istanza
@Override
// Ridefinisco le funzionalità di toString() del padre
public String toString() {
return super.toString() + “ “ + posti
}
}
Android Corso Base. Maurizio Cozzetto.
70. Super
Parola chiave che permette di far riferimento ai
metodi e agli attributi definiti nella superclasse
nel codice dei metodi di una classe derivata
Android Corso Base. Maurizio Cozzetto.
public class Automobile extends Veicolo {
int posti;
// Altre variabili di istanza
@Override
// Ridefinisco le funzionalità di toString() del padre
public String toString() {
return super.toString() + “ “ + posti
}
}
71. Polimorfismo
Android Corso Base. Maurizio Cozzetto.
Capacità di un “oggetto” di assumere forme
“differenti”
- In una gerarchia di classi, la possibilità di
adottare il “binding dinamico”
Automobile ferrariF40 = new Automobile("KU737WE","Ferrari
F40 rosso metallizzato", “Coupè”,2936); // 2936 è la cilindrata
// ferrariF40 è un anche un oggetto di tipo Veicolo
Veicolo ferrariF40 = new Automobile(...);
Proprietario me = new Persona(...);
// Richiamo un metodo della classe padre
System.out.println(ferrariF40.setProprietario(me));