Corso Base
Maurizio Cozzetto
Lezione 1
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.
Logo e mascotte
Android Corso Base. Maurizio Cozzetto.
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.
Sviluppo di un programma Java
Android Corso Base. Maurizio Cozzetto.
Esecuzione di un programma Java
Android Corso Base. Maurizio Cozzetto.
Piattaforma Java
Android Corso Base. Maurizio Cozzetto.
Piattaforma Java in dettaglio
Android Corso Base. Maurizio Cozzetto.
Caratteristiche del linguaggio/** * HelloWorld.java */package it.geca.corso.helloworld;
/** * @author maurizio */public class HelloWorld {
/** * @param args */public static void main(String[] args) {
System.out.println("Ciao Raffaele!");System.out.println("Benvenuto a Java!"); // commento inline
} // fine metodo entry-point
} // fine classe Android Corso Base. Maurizio Cozzetto.
Programma HelloWorld
Android Corso Base. Maurizio Cozzetto.
Demo
Il computer
Android Corso Base. Maurizio Cozzetto.
La memoria
Android Corso Base. Maurizio Cozzetto.
0
1
2
...
...
100
…
…
200
….
...
Locazioni di memoria
Indirizzi
Variabili (1/5)
Android Corso Base. Maurizio Cozzetto.
La variabile è un contenitore di dati
● Variabili di tipo primitivo● Variabili di tipo riferimento
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 0eta = 8; // Assegno a eta il valore 8eta = eta + 1; // Incremento di 1, quindi eta vale 9
int eta = 8; // Dichiarazione e assegnamento
8eta 100
int
Variabili (3/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo riferimento
JButton bottone; // Dichiaro un riferimento (vale null)
bottone null
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 riferimentobottone = new JButton(“Saluta”);
bottone 200
JButton
Saluta
250
...
200textxy
Variabili (5/5)
Android Corso Base. Maurizio Cozzetto.
Variabili di tipo riferimento
// Dichiaro il riferimento e creo l'oggetto in memoria con una sola istruzioneJButton bottone = new JButton(“Saluta”);
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
Variabili stringa (1/2)
// Creazione usando il costruttoreString nome = new String(“Raffaele”);
Android Corso Base. Maurizio Cozzetto.
String
Raffaele
nome
Variabili stringa (2/2)
// Assegnamento “diretto”String nome = “Raffaele”;
Android Corso Base. Maurizio Cozzetto.
String
Raffaelenome
Variabili data (1/2)
// Creo una dataGregorianCalendar miaDataDiNascita = new GregorianCalendar(1959, 3, 1);
Android Corso Base. Maurizio Cozzetto.
miaDataDiNascita GregorianCalendar
1959 YEAR
3 MONTH
1 DAY
Variabili data (2/2)
// Semplifichiamo la rappresentazione ma non il codiceGregorianCalendar miaDataDiNascita = new GregorianCalendar(1959, 3, 1);
Android Corso Base. Maurizio Cozzetto.
miaDataDiNascita
GregorianCalendar
1959-3-1
Variabili● Variabili di istanza● Variabili di classe● Variabili locali● Variabili parametro
Android Corso Base. Maurizio Cozzetto.
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.
Funzioni (2/2) public double computePayment( double loanAmt, double rate, double futureValue, int numPeriods) { double interest = rate / 100.0; double partial1 = Math.pow((1 + interest), - numPeriods); double denominator = (1 - partial1) / interest; double answer = (-loanAmt / denominator) - ((futureValue * partial1) / denominator); return answer;}
Android Corso Base. Maurizio Cozzetto.
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
Tipi primitivi
Android Corso Base. Maurizio Cozzetto.
int
int parseInt(String s)
Classe Integer
String toBinaryString(int i)
Classi wrapper
...
...
Android Corso Base. Maurizio Cozzetto.
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
Controllo del flusso (1/2)
Android Corso Base. Maurizio Cozzetto.
● Struttura di sequenza● Struttura condizionale
● Con un ramo● Con due rami
● Struttura switch
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
Sequenza
Android Corso Base. Maurizio Cozzetto.
Sequenza in Java
Android Corso Base. Maurizio Cozzetto.
{<istruzione1>;<istruzione2>;<istruzione3>;...
}
Demo
Struttura condizionale con un ramo
Android Corso Base. Maurizio Cozzetto.
Struttura condizionale con un ramo in Java
Android Corso Base. Maurizio Cozzetto.
if (<cond>) {<istruzione1>;<istruzione2>;<istruzione3>;...
}
Demo
Struttura condizionale con due rami
Android Corso Base. Maurizio Cozzetto.
Struttura condizionale con due rami in Java
Android Corso Base. Maurizio Cozzetto.
if (<cond>) {<istruzione11>;<istruzione12>;<istruzione13>;...
} else {<istruzione21>;<istruzione22>;...
}Demo
Struttura ciclica while
Android Corso Base. Maurizio Cozzetto.
Struttura ciclica while in Java
Android Corso Base. Maurizio Cozzetto.
while (<cond>) {<istruzione1>;<istruzione2>;<istruzione3>;...
}
Demo
Struttura ciclica do-while
Android Corso Base. Maurizio Cozzetto.
Struttura ciclica do-while in Java
Android Corso Base. Maurizio Cozzetto.
do {<istruzione1>;<istruzione2>;<istruzione3>;...
} while (<cond>);
Demo
Struttura ciclica for
Android Corso Base. Maurizio Cozzetto.
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
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
Ciclo infinito
Android Corso Base. Maurizio Cozzetto.
Ciclo infinito in Java
Android Corso Base. Maurizio Cozzetto.
while (true) { <istruzione1>;<istruzione2>;<istruzione3>;...
}
Demo
Cicli generici
Android Corso Base. Maurizio Cozzetto.
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
Struttura ciclica generica (2/2)
Android Corso Base. Maurizio Cozzetto.
boolean finito = false;
while (!finito) { <istruzione1>;if (<cond>)
finito = true; else {
<istruzione2>;...
}}
Demo
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
Array (2/6)
Android Corso Base. Maurizio Cozzetto.
● Dichiarazioneint[] a; // Significa a = null
nulla
Array (3/6)
Android Corso Base. Maurizio Cozzetto.
● Allocazione di memoriaa = new int[5]; // Trova lo spazio necessario
int[]
0 0
0 1
0 2
0 3
0 4
a
int[]
2 0
4 1
6 2
8 3
10 4
Array (4/6)
Android Corso Base. Maurizio Cozzetto.
a[0] = 2;a[1] = 4;a[2] = 6;a[3] = 8;a[4] = 10;
● Assegnamenti
a
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.
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
Array (6/6)
Android Corso Base. Maurizio Cozzetto.
Demo
● Dichiarazione e assegnamentoint[] a = {2,4,6,8,10}; // Attenzione! Non si può “spezzare”// oppure// int a[] = new int[]{2,4,6,8,10};
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.
Classi (2/5)
Android Corso Base. Maurizio Cozzetto.
Personanome: stringa
cognome: stringa
dataNascita: data
cittaResidenza: stringa
Persona()
Persona(nome: stringa, …, cittaResidenza: stringa)
toString(): stringa
eta(): intero
Nome della classe
Variabili di istanza
Metodi
Classi (3/5)
public class Persona {String nome;String cognome;GregorianCalendar dataNascita;String cittaResidenza;
// costruttore di defaultpublic Persona() {
// una persona “precisa”}
...
Android Corso Base. Maurizio Cozzetto.
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.
Classi (5/5) // Metodo che deriva dalla classe Object
public String toString() {return cognome + “ “ + nome + “ “ + eta();
}
// Idempublic 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.
Oggetti (1/3)
● Un oggetto è un rappresentante della classe● La creazione avviene mediante il richiamo di uncostruttore● 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.
Oggetti (2/3)
// Costruttore di defaultPersona raffaeleTomasini = new Persona();
Android Corso Base. Maurizio Cozzetto.
Persona
Raffaele nome
Tomasini cognome
1988-3-17 dataNascita
Brescia cittaResidenza
raffaeleTomasini
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
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.
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.
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.
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
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 padrepublic String toString() {
return super.toString() + “ “ + posti}
} Android Corso Base. Maurizio Cozzetto.
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 padrepublic String toString() {
return super.toString() + “ “ + posti}
}
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 padreSystem.out.println(ferrariF40.setProprietario(me));
Corso Base
Maurizio Cozzetto
5 minuti di pausa