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