OGGETTO
attributi
CLASSE metodi
PACKAGE
storia di Java
C’era una volta nel 1991, a Mountain View in California, un azienda di computer chiamata Sun
Microsystem che costituì un nuovo piccolo gruppo di ricerca e sviluppo con lo scopo di creare
una tecnologia sulla quale l’industria dell’elettronica ( televisori, altri piccoli dispositivi, ecc.)
poteva contare. Al team, fisicamente separato dalla società da cui era nato, gli fu assegnata
una missione: sviluppare un ambiente software platform-indipendent, semplice da utilizzare,
che doveva essere installato in questi piccoli e portabili “articoli elettronici”. L’obiettivo fu anche
proposto a James Gosling che si associò da subito al team.
Il Green Team
Al progetto a cui iniziarono a lavorare Gosling & Co., fu dato un nome: “Green Project”.
“Green” in quanto tutti i componenti avevano poca esperienza nello sviluppo di software nel
settore dell’elettronica di consumo. Inizialmente infatti svilupparono un software adatto alle
esigenze della mini-elettronica, ben lontano da rendere i personal computer facili da utilizzare.
I consumatori, che si aspettavano qualcosa di stabile ed a basso costo, non furono disposti ad
acquistare e ad imparare la nuova tecnologia, per niente stabile e con numerosi bug.
I primi sviluppi
Un altro ostacolo da superare fu l’indipendenza dalla piattaforma, per andare incontro ai
consumatori che non sapevano di che CPU disponevano e perché molto spesso anche i
produttori sostituivano la CPU con nuove versioni per abbassare i costi. Il Green Team partì
quindi dal presupposto di non conoscere la piattaforma (CPU e sistema operativo) sulla quale il
nuovo software doveva essere eseguito.
Con questi presupposti, il team di Gosling sviluppò un sistema derivante dalla estensione del
compilatore C++ che però ben presto non rispettò le aspettative. Fu a questo punto che
Gosling fece partire il Green Project, ovvero un progetto totalmente nuovo sulla base di
specifiche che aveva in mente. Nacque così, intorno alla metà del 1991, Oak, un linguaggio di
programmazione object oriented, platform-indipendent, robusto e sicuro.
Il nome Oak deriva dal fatto che Gosling nella definizione delle directory del nuovo linguaggio
si ispirò ad una quercia che vedeva attraverso la finestra del suo ufficio.
I primi frutti
Nell’agosto del 1992 il Green Team rilasciò “*7 (Star Seven)”, un dispositivo simile ad un PDA.
Chiamato come una sequenza di tasti ripetutamente utilizzata dal team, “*7” era basato su
quattro tecnologie sviluppate dal team:
- Il linguaggio Oak
- GreenOS, un sistema operativo
- Una interfaccia utente
- Il dispositivo stesso
Riacquistare fiducia
Nonostante quanto era accaduto, FirstPerson/Sun continuò la ricerca nel settore del mercato
“set-top box”, accordandosi con 3DO per la fornitura di un sistema operativo “set-top box”.
Dopo qualche mese la tecnologia fornita da FirstPerson non soddisfò le esigenze di 3DO e
l’accordo sfumò. Nel dicembre del 1993, Sun concluse che la direzione e la strategia intrapresa
da FirstPerson non aveva sbocchi sul mercato del “set-top box”. Nei primi mesi del 1994,
Gosling ed il suo team decisero che il mercato della televisione “set-top box” non era
perseguibile, almeno al livello che loro
pensavano. Così il team cambio
nuovamente direzione dirigendosi verso i
servizi on-line, i Cd-Rom ed i sistemi basati
sulle reti. Il nuovo piano fu presentato
ufficialmente a Sun che non lo considerò
abbastanza valido, tanto che alla fine
dell’anno FirstPerson fu definitivamente
chiusa e metà del team fu licenziato
mantenendo solo poche persone.
package lezione001;
// attributi
public int annoDiNascita;
public String nome;
public String cognome;
public char sesso;
// costruttori
public persone(int annoDiNascita, char sesso, String nome, String cognome) {
this.annoDiNascita = annoDiNascita;
this.nome = nome;
this.cognome = cognome;
this.sesso = sesso;
}
// metodi
public int calcolaEta(int annoAttuale) {
return (annoAttuale - annoDiNascita);
}
esercizio
scrivere un metodo che rappresenti a video nome cognome ed età della persona; soluzione (il
metodo va aggiunto alla classe persone):
mario.scriviEta(2008);
progetto di esempio sull’ereditarietà
package lezione001;
// attributi
public int matricola;
public int votoStoria;
public int votoItaliano;
public int votoGinnastica;
// costruttori
public studenti
(int annoDiNascita, char sesso, String nome, String cognome, int matricola) {
super(annoDiNascita,sesso,nome,cognome);
this.matricola = matricola;
}
// metodi
public String scriviMatricola (char separatore) {
return Integer.toString(matricola) + separatore + Integer.toString(annoDiNascita);
}
esercizio
esercizio
esercizio
creare un metodo che calcoli la media dei voti di uno studente; soluzione:
esercizio
creare un metodo che partendo dai voti di uno studente restituisca l’esito dell’anno scolastico
(se la media è inferiore a cinque, bocciato; fra cinque e sei promosso con debito; sopra il sei
promosso); soluzione:
}
i modificatori di accesso
public:
Può essere utilizzato sia relativamente ad un membro (attributo o metodo) di una classe, sia relativamente ad
una classe stessa. Abbiamo già abbondantemente visto l’utilizzo relativo ad un membro di una classe.
Sappiamo oramai bene, che un membro dichiarato pubblico, sarà accessibile da una qualsiasi classe situata in
qualsiasi package.
protected:
Questo modificatore definisce per un membro, il grado più accessibile dopo quello definito da public. Un
membro protetto, sarà infatti accessibile all’interno dello stesso package, ed in tutte le sottoclassi della classe in
cui è definito, anche se non appartenenti allo stesso package.
default:
Se non anteponiamo modificatori d’accesso ad un membro di una classe, esso sarà accessibile solo da classi
appartenenti al package dove è definito. Se dichiariamo una classe appartenente ad un package, senza
anteporre alla sua definizione il modificatore public, essa sarà visibile solo dalle classi appartenenti allo stesso
package. Possiamo considerare allora anche un incapsulamento di secondo livello.
private:
Questo modificatore restringe la visibilità di un membro di una classe alla classe stessa.
Il tutto è riassunto nella seguente tabella riguardante i modificatori di accesso e la relativa visibilità (solo per i
membri di una classe):
final:
Questo semplice modificatore ha un’importanza fondamentale. È applicabile sia a variabili, sia a metodi, sia a
classi. Potremmo tradurre il termine final proprio con "finale", nel senso di "non modificabile". Infatti una
variabile dichiarata final diviene una costante; un metodo dichiarato final non può essere riscritto in una
sottoclasse (non è possibile applicare l’override); una classe dichiarata final non può essere estesa.
static:
Questo modificatore rappresenta un fondamentale e potente comando di Java. Con static, la programmazione
ad oggetti, trova un punto di incontro con quella strutturata, ed il suo uso, deve essere quindi limitato a
situazioni in cui realizzi in una concreta utilità. Potremmo tradurre il termine static con "condiviso da tutte le
istanze della classe", oppure "della classe". Per quanto detto, un membro statico ha la caratteristica di poter
essere utilizzato mediante una particolare sintassi del tipo:
nomeClasse.nomeMembro
in luogo di:
nomeOggetto.nomeMembro
Anche senza istanziare la classe, l’utilizzo di un membro statico, provocherà il caricamento in memoria della
classe contenente il membro in questione, che quindi, condividerà il ciclo di vita con quello della classe.
abstract:
Il modificatore abstract può essere applicato a classi e metodi. Un metodo astratto, è un metodo che non
implementa un proprio blocco di codice e quindi il suo comportamento. In pratica, un metodo astratto, non ha il
blocco di codice, ma termina con un punto e virgola. Un esempio di metodo astratto potrebbe essere il
seguente:
Ovviamente, questo metodo, non potrà essere chiamato, ma potrà essere soggetto a riscrittura (override) in
una sottoclasse. Inoltre, un metodo astratto, potrà essere definito solamente all’interno di una classe astratta.
In altre parole, una classe che contiene anche un solo metodo astratto, deve essere dichiarata astratta. Una
classe dichiarata astratta, non può essere istanziata. Quindi, il programmatore che ha intenzione di marcare
una classe con il modificatore abstract, deve essere consapevole a priori che da quella classe non saranno
istanziabili oggetti.
N.B.: il grosso vantaggio che offre l’implementazione di una classe astratta, è che "obbliga" le sue sottoclassi ad
implementare un comportamento. A livello architetturale, la progettazione di classi astratte è un strumento
fondamentale.
20/05/08 – seconda lezione
tipi di dati
Java ha due gruppi di tipi di dati, tipi di dati primitivi e riferimenti a oggetti.
Un modo per ricordare il Java primitiva tipi di dati è di utilizzare questo aiuto mnemonico:
Attenzione: Attenzione, Orsi Orsi Shouldn Se non ingerire ingerire Grande Grande Furry Furry
Cani Cani.
* Grado variabili vengono assegnati valori di default; variabili locali non vengono assegnati valori
di default.
A differenza di Java primitiva tipi di dati che memorizzare dati effettivi, riferimenti a oggetti
memorizzare soltanto un riferimento ai dati effettivi oggetto.
1 - Local Variable: una variabile è detta locale quando viene dichiarata localmente (dentro la classe), quindi ha effetto solo in
quella classe in cui è stata dichiarata.
2 - Class Variable: le variabili di classe sono dei campi dichiarati utilizzando la parola chiave static in una dichiarazione di
classe, oppure anche con o senza static in una dichiarazione di Interfaccia, una variabile di classe viene creata quando la
classe o l'interfaccia viene dichiarata e termina il suo ciclo di vita insieme alla classe o all'interfaccia.
3 - Instance Variable: le variabili d'istanza sono invece quelle variabili dichiarate dentro una classe senza la parola chiave
static.
4 - Array Components: sono quelle variabili che contengono più di un valore, troverete nel capitolo 7 maggiori informazioni
sugli Array.
5 - Method Parameters: sono delle variabili utilizzate come valori di argomenti che si passano con i Metodi o Funzioni().
6 - Constructor Parameters: ovvero valori di argomenti passati dal Costruttore. Come le proprietà di un oggetto.
7 - Exception-handler Parameters: esistono delle variabili che catturano il tipo di Eccezione (errore gestibile) e ne riportano
l'identificazione.
Esistono anche delle variabili dette Costanti, perchè non possono cambiare il valore impostato alla creazione, vengono definite
costanti quando si applica la parola chiave final.
// esempio di variabile costante
final int numeroCinque = 5;
I tipi di dati si suddividono in Integrali, a Virgola mobile ed Espressivi:
int x = 5;
int y = 10;
boolean risultatoBinario;
risultatoBinario = (x == y);
System.out.println(risultatoBinario); // restituisce false
Naturalmente possiamo anche crearci dei nostri Tipi di dati detti definiti dall'utente, spiegheremo come nel capitolo 8, dedicato
alla Programmazione Orientata agli Oggetti.
Per poter convertire una variabile da un tipo di dato ad un altro, si usa un'operazione chiamata Casting:
// esempio Casting
float f = 2.5;
int i = (int) f;
// converte f in un intero
// escludendo i decimali dichiarato con i
Operatori e Condizioni
Home + Java + Guida Java + Operatori e Condizioni
Naturalmente per poter effettuare delle condizioni, tra le variabili dobbiamo inserire dei caratteri corrispondenti a degli
operatori: esistono Operatori matematici e Operatori di espressione, ne elenchiamo i più usati:
Operatori matematici:
+ addizione (o anche concatenazione di stringe)
- sottrazione
/ divisione
* moltiplicazione
++ incremento
-- decremento
Nota:
per elevare un numero a potenza si utilizza il metodo pow(double a, double b) della classe java.lang.math.
Ad esempio, per elevare il numero 3 al quadrato utilizzeremo:
double potenza = java.lang.math.pow(3,2);
Operatori di espressione:
= assegnazione
== ugualianza
!= differenza
> maggiore
< minore
&& e (AND logico)
|| o (OR logico)
E' possibile concatenare tra loro diversi Operatori per avere significati differenti:
>= maggiore e uguale
<= minore e uguale
+= assegna e aggiunge un valore
-= assegna e sottrae un valore
Facciamo qualche esempio:
int x = 1; // utilizziamo l'operatore = di assegnazione
int y = x + 1; // y sarà uguale a 2
y += 10; // y diventa 12
if (x == y)
{
System.out.println("Primo risultato FALSO");
}
else if (y > x)
{
System.out.println("Secondo risultato VERO");
}
Abbiamo visto come è possibile utilizzare gli operatori, analizziamo ora nel dettaglio cosa sono e come possiamo scrivere le
condizioni in Java: leggendo l'esempio qui sopra riportato vi troviamo una riga con la condizione if, seguita (tra parentesi)
dalla condizione che x deve essere uguale a y. Avrei potuto anche omettere le parentesi graffe, infatti se l'istruzione che segue
è una sola non c'è bisogno di racchiudere in blocco, ma è importante che almeno agli inizi vi abituate ad utilizzarle le parentesi
graffe. Seguendo troviamo la condizione else if, che indica una alternativa determinando una ulteriore condizione (se y è
maggiore di x), anch'essa deve essere seguita da un blocco di graffe, nel caso in cui le istruzioni da eseguire siano maggiori di
una.
Ci sono anche altri modi più abbreviati di scrivere una condizione, ritornando alla nostra secoda classe Temp.java, descritta
nel secondo capitolo, analizziamo quest'altra condizione:
System.out.print(i == 0 ? args[i] : " " + args[i]);
/*
la sintassi è la seguente:
condizione ? istruzione se vera : istruzione se falsa
*/
Se la variabile i è uguale a 0 scrive il contenuto dell'Array args[i], altrimenti scrive prima uno spazio vuoto seguito dal valore
stesso.
esercitazioni matematiche
do {
fattoriale = fattoriale * i;
i++;
} while (i <= numero);
return fattoriale;
}
return a * b;
esercizio
esercizio
creare un metodo che calcoli l’area di un triangolo dati base e altezza; soluzione:
esercizio
creare un metodo che calcoli l’area di un triangolo con la formula di Erone; soluzione:
return Math.sqrt(
semiperimetro * (semiperimetro - a) * (semiperimetro - b) * (semiperimetro - c));
}
esercizio
creare un metodo che calcoli l’ipotenusa di un triangolo rettangolo; soluzione: