Primi concetti di Java OO puro Ogni cosa è un oggetto Tipi primitivi

OO puro
Primi concetti di Java
Java è object-oriented puro
Non come il C+ + (OO ibrido)
Per compatibilità col C
Lorenzo Bettini
Ogni cosa è un oggetto
Gli oggetti si manipolano tramite
riferimenti
String s;
I riferimenti devono essere inizializzati
String s = new String(“foo”);
String s1 = “foo”;
String s2;
S2 = new String(“foo”);
Tipi primitivi
Caso speciale: i tipi primitivi:
int i = 10;
char c = ‘a’;
bool b = true;
Wrapper per tipi primitivi:
Integer i = new Integer(10);
Character c = new Character(‘a’);
Boolean b = new Boolean(true);
1
Allocazione di memoria
Ambito di visibilità o portata
È determinato dal posizionamento delle
parentesi graffe (blocchi di codice):
Gli oggetti creati con new sono allocati
nello heap
Non è necessario liberare questa
memoria (cioè distruggere un oggetto)
Ci pensa il Garbage Collector
{
int x = 12;
/* solo x è disponibile */
{
int q = 96;
/* x e q entrambi disponibili */
}
/* solo x è disponibile */
/* q è fuori portata (“out of scope”) */
}
Hello world!
Hello world!
Classe “globale”
// HelloWorld.java
// HelloWorld.java
public class HelloWorld {
public class HelloWorld {
public static void main(String args[]) {
public static void main(String args[]) {
System.out.println("Hello world!");
System.out.println("Hello world!");
}
}
Nome = al file
}
}
2
Hello world!
Visibile all’esterno
della class
Hello world!
Non legato ad un
particolare oggetto
della classe
public class HelloWorld {
Punto di ingresso
per eseguire un’applicazione
public class HelloWorld {
public static void main(String args[]) {
public static void main(String args[]) {
System.out.println("Hello world!");
System.out.println("Hello world!");
}
}
}
}
Hello world!
Modo standard di stampare
una stringa sullo schermo
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello world!");
Gestione array
Dichiarazione di un array
int [] a1;
int a1[];
Inizializzazione
int[] a1 = {1, 2, 3, 4, 5};
int[] a2 = new int[d];
}
}
3
Esempio di uso di array
public class Arrays {
public static void main(String[] args) {
int[] a1 = { 1, 2, 3, 4, 5 };
int[] a2;
a2 = a1;
I Java package
for(int i = 0; i < a2.length; i++)
a2[i]++;
for(int i = 0; i < a1.length; i++)
System.out.println(
"a1[" + i + "] = " + a1[i]);
}
Basati sui lucidi di Matteo Baldoni,
Dip. di Informatica, Univ. di Torino
}
Cos’è un package?
Perché usiamo le cartelle (direttori, folder) sul nostro
desktop?
Perché desideriamo tenere insieme i file che hanno uno stesso
scopo o utilità
Per ritrovare i file con maggiore facilità in un momento successivo
Per archiviare i file più facilmente e passarli a qualcun’altro
Per garantire l’unicità ai nomi dei file
Spesso un direttorio è strutturato in sottodirettori
Un package può essere visto come una cartella di classi Java
Package
La cartella dove sviluppiamo un applicativo Java è un
package, il package di default di Java
I package possono essere strutturati in sottopackage
come le cartelle
Possono essere archiviati in file compressi (JAR file)
Definiscono spazi dei nomi separati per garantire
unicità agli identificatori da noi utilizzati
Le librerie di Java sono tutte organizzate in package e
sottopackage
4
Package
Package
j ava
ut il
package
pu blic
Come fare della nostra semplice cartella
di classi un vero e proprio package?
classi
inter facce
awt
event
Come utilizzare un package all’interno di
un file e quindi rendere disponibili le
utilità in esso definite?
...
L’istruzione package
Posso definire che un certo file che contiene una
certa classe pubblica e un certo numero di altre classi
(non pubbliche!) fa parte di un certo package
mediante la parola chiave package
Un esempio
Voglio definire un package di
nome geometria contenente a
sua volta due package di nome
poligoni e prismi
package nomedelpackage ;
class nomedellaclasse { . . . }
prim a ist ruzione!
nomedelpackage . nomedellaclasse
5
Dichiarazione di un package
I n ogni file .java del sottodirettorio poligoni di
geometria aggiungerò come prima istruzione
package geometria.poligoni;
I n ogni file .java del sottodirettorio prismi di
geometria aggiungerò come prima istruzione
package geometria.prismi;
Package, javac e java
package geometria.poligoni;
public class Rettangolo {
[…]
}
Nel direttorio esempiPackage:
Per la compilazione
javac geometria\poligoni\Rettangolo.java
Per l’esecuzione
java geometria.poligoni.Rettangolo
Effetto
Effetto della precedente dichiarazione sarà
quella di associare alla classe Poligono e
Prisma il nome di
geometria.poligoni.Poligono
geometria.prismi.Prisma
Questi sono i veri nomi delle classi ed è così
che andranno identificate
Organizzazione e nomi simile a quella dei file
nei direttori
L’istruzione import
Scrivere i nomi delle classi è diventato meno agevole
e sicuramente più tedioso
L’istruzione import permette di semplificare la
scrittura dei nomi delle classi in package
include in C/C+ + vs import in Java
I m port o il nom e della
import geometria.poligoni.Rettangolo; classe Poligono nel
import geometria.poligoni.*;
package
geom et ria.poligoni
I m port o t ut t i i nom i del
package geom et ria.poligoni
6
CLASSPATH: lo spazio dei nomi
Dove andare a cercare i vari package e classi?
Come rendere accessibili i miei package da un direttorio
qualsiasi?
Java fa uso (sia in compilazione che in esecuzione) della
variabile di ambiente CLASSPATH
in m odo definit ivo ( nel file aut oexec.bat)
SET CLASSPATH=.;C:\esempi\esempiPackage
Classpath: lo spazio dei nomi
javac -classpath .;C:\esempi\provaclasspath\directory1;
C:\esempi\provaclasspath\directory2 ProvaClassPath.java
import javamio.util.*;
import corso.*;
class ProvaClassPath {
A a = new A();
}
javac -classpath .;C:\esempi\esempiPackage
java -classpath .;C:\esempi\esempiPackage
t em poraneam ent e
Visibilità dei membri delle classi
Ad ogni membro di una classe può essere
associata una delle parole chiave:
nessuna visibile a tutte le classi dello stesso
package
public visibile a tutti (parte dell’interfaccia
dell’oggetto)
HelloDate
Come HelloWorld ma
Voglio stampare anche la data corrente
Come posso stampare la data in Java?
private visibile solo alla classe stessa
protected visibile a tutte le sottoclassi ed alle
classi dello stesso package
7
HelloDate
// HelloDate.java
import java.util.*;
public class HelloDate {
public static void main(String[] args) {
System.out.println("Hello, it’s: ");
System.out.println(new Date());
}
}
8