Lezione 18 - Server users.dimi.uniud.it

annuncio pubblicitario
Package, javadoc, API
5/05/2003
Riassunto: OO in Java
3DFNDJHMDYDGRF
LQWURGX]LRQHDOOH$3,
z class
z public, private,
protected
Stefano Mizzaro
z costruttore, new
z this
z GRWQRWDWLRQ (C.m(),
Dipartimento di matematica e informatica
Università di Udine
http://www.dimi.uniud.it/~mizzaro
[email protected]
5 maggio 2003
x.m())
z
z
z
z
z
z
super
instanceof
Maniglie
abstract
interface
implements
z extends
Stefano Mizzaro - Package, javadoc, API
Scaletta
Package
z 3DFNDJH
z Javadoc
z API
z
z
z
z
z
z
– Package principali
– Classi principali
– Documentazione con javadoc
Stefano Mizzaro - Package, javadoc, API
2/46
3/46
Insieme di classi e interfacce
“Namespace”
Struttura gerarchica
Basata sul file system
Nomi univoci grazie al dominio internet
Due istruzioni:
package e import
Stefano Mizzaro - Package, javadoc, API
4/46
import
package
z Dice in quali package/classe cercare i nomi usati
nelle classi di questo file
LPSRUWQRPHSDFNDJH!QRPHFODVVH!
LPSRUWQRPHSDFNDJH!
z Esempi
SDFNDJHQRPHSDFNDJH!
z Prima istruzione di un file
z In quale package mettere le classi (e le
interfacce) del file
z Se l’istruzione non c’è ⇒ package “di
default”
– import java.util.Calendar;
– import java.util.*;
– import java.io.*;
z N.B.: LPSRUWMDYD
Stefano Mizzaro - Package, javadoc, API
Stefano Mizzaro
5/46
Stefano Mizzaro - Package, javadoc, API
6/46
1
Package, javadoc, API
5/05/2003
)XOOTXDOLILHGQDPH
Package e file system
z La struttura gerarchica dei package
corrisponde a quella del file system
z QRPHSDFNDJH!QRPHFODVVH!
z java.util.Calendar
z java.applet.Applet
z Quindi: l’import serve per evitare di
scrivere i full qualified name ogni volta
– Le classi del package a vanno nella directory a
– Le classi del package a.b vanno nella
directory a/b
– …
– I file del package xxx.yyy.zzz vanno nella
directory xxx/yyy/zzz
– E la radice deve essere in CLASSPATH
Stefano Mizzaro - Package, javadoc, API
7/46
Stefano Mizzaro - Package, javadoc, API
Diagramma dei package
Esempio
p
z Nel package p.a (directory ./p/a) ci
sono 2 classi A e B (sottoclasse di A)
z Nel package p.b (directory ./p/b) ci
sono 3 classi C, D (sottoclasse di C) ed E
(sottoclasse di B)
z Nel package p (directory ./p) c’è la classe
F (che usa tutte le altre classi)
Stefano Mizzaro - Package, javadoc, API
a
B
F
9/46
z Bisogna ULVDOLUHDOODUDGLFH
z Per compilare (usare nomi di file)
±YHUERVHS)MDYD
–!MDYDF
!MDYDF ±GELQ
±GELQ±YHUERVHS)MDYD
–!FGSMDYDF
!FGSMDYDF)MDYD
(non trova i package)
)MDYD
z Per eseguire (usare IXOOTXDOLILHG QDPHV)
–!MDYDS)
!MDYDS)
–!FGSMDYD)
!FGSMDYD) (non trova F, vuole p.F)
–!FGSMDYDS)
!FGSMDYDS) (non va, cerca il package/dir p)
Stefano Mizzaro
b
C
A
Package, compilazione, esecuzione
Stefano Mizzaro - Package, javadoc, API
8/46
11/46
D
E
Stefano Mizzaro - Package, javadoc, API
10/46
Nomi univoci di package
z Nome di package: xxx.yyy.zzz (minuscole!)
z Nomi che iniziano con “java.” sono riservati
(java.lang, java.io, java.util, … )
z Dal nome del dominio internet: il nome di un
package sviluppato in uniud.it inizia con
it.uniud
z e prosegue con un nome esplicativo deciso dal
programmatore: it.uniud.twm,
it.uniud.twm.progetto, …
Stefano Mizzaro - Package, javadoc, API
12/46
2
Package, javadoc, API
5/05/2003
Un esempio
Package e visibilità
z Attributi e metodi possono avere visibilità:
altropackage
PublicC
– public: ovunque, anche in altri package
PackageC
publicM()
protectedM()
packageM()
privat eM()
– protected: solo nelle sottoclassi HQHO
SDFNDJH
publicM()
protectedM()
packageM()
privateM()
– (niente) “package”: solo nel package
– private: solo nella classe
miopackage
Extens ionClass
z Classi e interfacce possono avere visibilità:
My C
AnotherClass
– public: anche da altri package
– (niente) “package”: solo nel package
Stefano Mizzaro - Package, javadoc, API
13/46
Stefano Mizzaro - Package, javadoc, API
I modificatori (non tutti!)
Scaletta
0HWRGR $WWULEXWR &ODVVH ,QWHUIDFFLD
SXEOLF
SULYDWH
SURWHFWHG
QLHQWH
DEVWUDFW
ILQDO
VWDWLF
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
z
Stefano Mizzaro - Package, javadoc, API
15/46
z Package
z -DYDGRF
z API
Stefano Mizzaro - Package, javadoc, API
p
z Generazione automatica della documentazione
z A partire dai commenti /** ... */
a
b
C
A
MDYDGRF >QRPHILOH!_QRPHSDFNDJH!@
produce la documentazione per <nomefile>
e/o <nomepackage>
B
z Tipicamente in HTML (configurabile: GRFOHW)
Stefano Mizzaro
16/46
Esempio (di nuovo)
Javadoc
Stefano Mizzaro - Package, javadoc, API
14/46
F
17/46
Stefano Mizzaro - Package, javadoc, API
D
E
18/46
3
Package, javadoc, API
5/05/2003
Generazione della documentazione
Documentazione e OO
z Documentazione utile anche durante la
programmazione
>javadoc -verbose -d doc p p.a p.b
– Per classi, interfacce, metodi, … definite dal
programmatore (trovare le definizioni nella
gerarchia)
– Per le API
z Facciamolo! (
…\lucidi\materiali\packages)
z Esaminiamola velocemente…
z Aggiungiamo commenti…
z Scrivere (e generare) la documentazione
LQVLHPHDOFRGLFH
– Un commento per ogni classe, interfaccia,
metodo o attributo public
Stefano Mizzaro - Package, javadoc, API
19/46
Stefano Mizzaro - Package, javadoc, API
Scaletta
20/46
Rassegna API?
z Package
z Javadoc
z $3,
z classi in package
z Gulp!
z Diamo “solo” uno sguardo mirato…
Stefano Mizzaro - Package, javadoc, API
21/46
Stefano Mizzaro - Package, javadoc, API
22/46
Un po’ di storia…
Fonti utili
Anno Vers.
z Documentazione in linea delle API
Altro
FODVVL SDFNDJH
Elettrodomestici, …
1991
Oak
– Creata con javadoc
1995
α
– In formato HTML
1996
1.0
– Navigabile con un browser
1997
1.1
– (…java/docs/)
1998
1.2
2000
1.3
2003
1.4
z Sorgenti (.java) delle API!
– File src.zip
HotJava, applets
– (…java/src/)
Stefano Mizzaro - Package, javadoc, API
Stefano Mizzaro
23/46
Stefano Mizzaro - Package, javadoc, API
Web browser
Java 2: Swing, collections
Bug fix, HotSpot
NIO, pattern match & r.e., XML
(DOM/SAX), assert, …
24/46
4
Package, javadoc, API
5/05/2003
Un po’ di package (usati spesso)…
z
z
z
z
java.lang: (importato implicitamente)
java.util: (date, contenitori di oggetti, …)
java.io: input/output, flussi, file, …
java.awt, java.awt.event,
javax.swing (GUI)
z java.applet (applet in pagine Web)
z java.sql (JDBC x accesso DB)
z java.rmi (Remote Method Invocation)
z…
Stefano Mizzaro - Package, javadoc, API
Un po’ di java.lang…
z
z
z
z
25/46
Object
System
Math
String
Stefano Mizzaro - Package, javadoc, API
26/46
java.lang.Object
java.lang…
z Radice della gerarchia, superclasse di tutte
le classi
z I suoi metodi sono ereditati da tutte le classi
– public String toString()
– public boolean equals(Object o)
– protected Object clone()
– …
Stefano Mizzaro - Package, javadoc, API
27/46
class Punto {
// ...
public String toString () {
return "Punto: (" + getX() + ", " + getY() + ")";
}
}
z public String toString()
z Restituisce una rappresentazione testuale,
visualizzabile dell’oggetto
z Chiamato LPSOLFLWDPHQWH quando serve
z Da sovrascrivere in ogni classe che
definiamo
z (vediamo com’è fatto…)
Stefano Mizzaro
28/46
Esempio
toString
Stefano Mizzaro - Package, javadoc, API
Stefano Mizzaro - Package, javadoc, API
29/46
class ProvaPunto {
// ...
public static void main(String[] args) () {
Punto p = new Punto(2.3, 5.67);
System.out.print(p);
System.out.println(p);
>java ProvaPunto
}
Stefano Mizzaro - Package, javadoc, API
Punto: (2.3, 5.67)…
}
30/46
5
Package, javadoc, API
5/05/2003
equals
Esempio (1/3)
z public boolean equals(Object o)
z 2 tipi di uguaglianza fra x e y:
– Essere lo stesso oggetto (x == y)
– Essere 2 oggetti uguali (x.equals(y))
z == confronta solo i riferimenti!!
z In realtà, l’equals di Object è come l’==…
z …ma equals può essere sovrascritto!
Stefano Mizzaro - Package, javadoc, API
31/46
Esempio (2/3)
class Punto {
// ...
public boolean equals (Object o) {
return (((Punto)o.x) == this.x &&
((Punto)o).y == this.y);
}
}
z Notate il downcast: devo sovrascrivere, e il
parametro di equals è Object…
z Si può fare di meglio…
Stefano Mizzaro - Package, javadoc, API
32/46
Esempio (3/3)
class Punto {
// ...
public boolean equals (Object o) {
if(o instanceof Punto)
return (((Punto)o).getX() == this.getX() &&
((Punto)o).getY() == this.getY());
else
return false;
}
}
class Punto {
// ...
public boolean equals (Object o) {
return (o instanceof Punto &&
((Punto)o).getX() == this.getX() &&
((Punto)o).getY() == this.getY()
);
}
}
z Ancora meglio…
Stefano Mizzaro - Package, javadoc, API
33/46
clone
z Proviamo a clonare
una Pila
z p2 = p1 crea un alias
z Bisogna usare clone,
che però è
protected…
– x = y copia solo la maniglia (alias)
– x = y.clone() crea una nuova copia
z clone può essere sovrascritto in ogni
classe che vogliamo rendere clonabile
z Ma è protected…
Stefano Mizzaro
34/46
La clonazione: perché l'= non va
z protected Object clone()
z Duplica un oggetto
z Come per l’equals, 2 tipi di copiatura:
Stefano Mizzaro - Package, javadoc, API
Stefano Mizzaro - Package, javadoc, API
35/46
Stefano Mizzaro - Package, javadoc, API
class Cliente {
public ... main ...{
...
Pila p1, p2;
p1 = new Pila();
...
// ... modifiche a p1...
p2 = p1;
// ... altro codice...
}
}
36/46
6
Package, javadoc, API
5/05/2003
clone (2/3)
clone (1/3)
z Sostituire p2 = p1
con p2 = (Pila) p1.clone()?
– (il cast perché clone restituisce un Object)
z Non va:
– clone della Pila p1 è ereditato da Object, in
cui è definito protected
– è visibile solo nel package di Object o nelle
sottoclassi di Pila
– Cliente vede il metodo clone di Object, non
di Pila!
Stefano Mizzaro - Package, javadoc, API
37/46
Stefano Mizzaro - Package, javadoc, API
clone (3/3)
Osservazioni:
z L’unica differenza è la visibilità
z Non si può definire un clone che
restituisce qualcosa di diverso da Object
z clone di Object fa una copia superciale
(shallow copy), non profonda (deep).
z Se serve una copia profonda, bisogna
modificare (sovrascrivendolo) clone
z Soluzione: Pila ri-implementa clone e lo rende
public
z Ri-implementazione standard: uso il clone della
sopraclasse
public Object clone() {
throws CloneNotSupportedException {
return super.clone();
}
Stefano Mizzaro - Package, javadoc, API
39/46
Stefano Mizzaro - Package, javadoc, API
public
public
public
public
public
public
public
public
public
public
...
z Sveliamo un mistero: perché
– System.out.println
– System.in.read
z Classe System
z Variabile di classe out (in)
public final static PrintStream out;
z Metodo d’istanza println (read)
Stefano Mizzaro
40/46
java.lang.Math
java.lang.System
Stefano Mizzaro - Package, javadoc, API
38/46
41/46
static
static
static
static
static
static
static
static
static
static
double
double
double
double
double
double
double
double
double
double
Stefano Mizzaro - Package, javadoc, API
sin(double)
cos(double)
sqrt(double)
log(double)
abs(double)
exp(double, double)
floor(double)
ceil(double)
min(double, double)
max(double, double)
42/46
7
Package, javadoc, API
5/05/2003
java.lang.String
java.lang.String
z 6WULQJ: modificabili
z Sequenza di caratteri
z String: sottoclasse final di Object
z Letterali stringa: "" (chiamata implicita del
costruttore)
z : concatena stringhe
Stefano Mizzaro - Package, javadoc, API
z (e 6WULQJ%XIIHU: non modificabili)
z SXEOLFLQWOHQJWK
z SXEOLFLQWFKDU$WLQW
z SXEOLFERROHDQHTXDOV2EMHFW
z SXEOLF6WULQJ VXEVWULQJLQW
z SXEOLF6WULQJ VXEVWULQJLQWLQW
z SXEOLF FKDU>@ WR&KDU$UUD\
43/46
Riassunto
abstract boolean break byte case
catch char class const continue
default do double else extends false
final finally float for goto if
implements import instanceof int
interface long QDWLYH new null
package private protected public
return short static super switch
V\QFKURQL]HG this throw throws
WUDQVLHQW true try void YRODWLOH
while
– Object
z toString, equals, clone
– System
– Math
– String
Stefano Mizzaro
44/46
Parole riservate (di nuovo)
z Package
z Javadoc
z API
Stefano Mizzaro - Package, javadoc, API
Stefano Mizzaro - Package, javadoc, API
45/46
Stefano Mizzaro - Package, javadoc, API
46/46
8
Scarica