I metodi statici -1 n I metodi statici non hanno il parametro implicito n I metodi statici vengono detti anche metodi di classe perche` non operano su una q La programmazione O.O. e i metodi statici n Esempio: il metodo sqrt di Math n particolare istanza della classe n Esempio: Math.sqrt(m); q Math e` il nome della classe non di un oggetto Linguaggi di Programmazione II 2003-04 Annalisa De Bonis 24 I metodi statici -2 n Se si usano troppi metodi statici si utilizza poco la programmazione orientata agli oggetti Se si usano troppi metodi statici vuol dire che le classi che usiamo non modellano adeguatamente le entita` su cui vogliamo operare Annalisa De Bonis n public static boolean approxEqual(double x, double y) {... } • Non ha senso invocare approxEqual con un oggetto come parametro implicito Dove definire approxEqual? n n Scelta 1. nella classe che contiene i metodi che invocano approxEqual Scelta 2. creiamo una classe, simile a Math, per contenere questo metodo e possibilmente altri metodi che svolgono elaborazioni numeriche Public class Numeric{ public static boolean approxEqual(double x, double y){ ... } //altri metodi numerici } Annalisa De Bonis Linguaggi di Programmazione II 2003-04 n 25 Vogliamo assegnare a ciascun conto un numero identificativo diverso q Il costruttore crea il primo conto con il numero 1, il secondo con il numero 2, ecc. public class BankAccount { public BankAccount() { lastAssignedNumber++ // numero da assegnare al nuovo conto accountNumber = lastAssignedNumber; } ... private double balance; private int accountNumber; private static int lastAccountNumber; } Se lastAccountNumber non fosse dichiarata static, ogni istanza di BankAccount avrebbe il proprio valore di lastAccountNumber Annalisa De Bonis Linguaggi di Programmazione II 2003-04 Ogni oggetto BankAccount ha il suo campo accountNumber Il metodo main e` statico perche` quando viene invocato non esiste ancora alcun oggetto q 28 Variabili statiche e variabili di istanza Il metodo main n 27 Variabili statiche Metodi che manipolano esclusivamente tipi primitivi q Linguaggi di Programmazione II 2003-04 public static void main (String [ ] args){…} C’e` un unico lastAssignedNumber per tutti gli oggetti BankAccount Annalisa De Bonis Linguaggi di Programmazione II 2003-04 26 Annalisa De Bonis Linguaggi di Programmazione II 2003-04 29 1 PDF created with pdfFactory Pro trial version www.pdffactory.com Inizializzazione di variabili statiche n La costanti statiche Le variabili statiche non devono essere inizializzate dal costruttore public BancAccount{ lastAssignedNumber = 0; … } /*errore: lastAssignedNumber viene azzerata ogni volta che viene costruito un nuovo conto*/ Se i valori con cui vengono inizializzate automaticamente le variabili sono appropriati, il programma puo` non inizializzarle affatto 30 Uso delle variabili statiche -1 q q Controindicazioni all’uso delle variabili statiche: I metodi che modificano variabili statiche hanno effetti collaterali I metodi che leggono variabili statiche potrebbero avere comportamenti diversi a seconda del valore delle variabili statiche n Linguaggi di Programmazione II 2003-04 31 Uso delle variabili statiche -2 Annalisa De Bonis Linguaggi di Programmazione II 2003-04 33 nIn java le variabili possono essere dichiarate ovunque nel codice e si possono fare anche cose del tipo nint nint a=20; n=a*10; n Un metodo che memorizza i risultati di una computazione in variabili statiche in modo che possano essere disponibili alla fine della sua esecuzione: à Annalisa De Bonis Annalisa De Bonis n Esempio: n Le costanti statiche si possono usare liberamente q 32 34 -1 Ambito di visibilita` di una variabile (scope): parte del programma in cui si puo` fare riferimento alla variabile mediante il suo nome Ambito di visibilita` di una variabile locale: dalla sua dichiarazione alla fine del blocco q se non si reperiscono immediatamente i valori delle variabili statiche, questi potrebbero essere modificati da un altro metodo Linguaggi di Programmazione II 2003-04 Linguaggi di Programmazione II 2003-04 Visibilita` delle variabili E` bene non usare le variabili statiche per memorizzare temporaneamente dei valori q Sarebbe inutile che ciascun oggetto della classe BankAccount avesse una propria variabile COSTO_COMMISS con valore costante 1.5 E` molto meglio che tutti gli oggetti della classe BankAccount facciano riferimento ad un’unica variabile COSTO_COMMISS Se chiamiamo due volte uno stesso metodo fornendo gli stessi argomenti, esso potrebbe avere comportamenti diversi Annalisa De Bonis n n Es.: public static final COSTO_COMMISS=1.5; Dichiarazione di variabili Le variabili statiche vengono usate raramente q E` ragionevole dichiarare statica una costante q n n n q Si deve usare un’inizializzazione esplicita Es.: private static int lastAssignedNumber = 0; Linguaggi di Programmazione II 2003-04 Una costante statica e dichiarata usando le parole chiave static e final q n Annalisa De Bonis n Nell’ambito di visibilita` di una variabile locale non e` possibile definirne un’altra avente lo stesso nome Esempio: for(int i=0 ;i<10 ; i++){ … float i = 3.5; / *errore: qui non si puo`dichiarare un’altra variabile di nome i */ } Annalisa De Bonis Linguaggi di Programmazione II 2003-04 35 2 PDF created with pdfFactory Pro trial version www.pdffactory.com Visibilita` delle variabili n Visibilita` delle variabili -4 -2 Le variabili dichiarate all’interno di un metodo • • n Vivono finché il metodo è in esecuzione Oscurano il nome dei campi statici e non statici n Le variabili dichiarate in un blocco di istruzioni (tra { }) • Vivono finché il blocco è in esecuzione • Oscurano il nome dei campi statici e non statici Non oscurano la variabili definite (e ancora “in vita”) prima dell’inizio del blocco (ERRORE IN COMPILAZIONE) • Un metodo puo` accedere ad un campo (non private) o invocare un metodo (non private) di un’altra classe qualificandone il nome con: q Il nome della classe se si tratta di un metodo o di un campo statico n q n Annalisa De Bonis Linguaggi di Programmazione II 2003-04 Visibilita` di membri di classe 36 -1 La visibilita` di un membro di una classe puo` essere locale q Linguaggi di Programmazione II 2003-04 37 Visibilita` di membri di classe -2 q Un metodo puo` accedere ad un campo della sua stessa classe o invocare un metodo della sua stessa classe (in modo da fare riferimento al parametro implicito) specificandone semplicemente il nome q Esempio: public void trasferisci(double somma, BankAccount altro ) { preleva(somma); // equivale a this.preleva(somma) altro.deposita(somma) ; } Annalisa De Bonis Linguaggi di Programmazione II 2003-04 Esempio: Annalisa De Bonis Linguaggi di Programmazione II 2003-04 Visibilita` sovrapposte n Ambito di visibilita` dei membri di classe: consiste di tutti i metodi della stessa classe 40 -2 Se in un metodo si vuole fare riferimento ad una variabile di istanza che ha lo stesso nome di una variabile locale allora occorre usare il riferimento this q 38 -1 public class Coin { public void draw(Graphics2D g2) { String name = "SansSerif"; // variabile scope ... } private String name; //variabile di istanza private double value ; } Dati due oggetti obj1 e obj2 di una classe C, obj1.x è diverso da obj2.x • I metodi statici non vedono i campi non statici se questi non sono riferiti ad un certo oggetto Annalisa De Bonis 39 La variabile locale oscura la variabile di istanza con lo stesso nome n Date due classi distinte C1 e C2, C1.x è diverso da C2.x Ogni oggetto ha la sua copia dei campi non statici • Linguaggi di Programmazione II 2003-04 Gli ambiti di visibilita` di una variabile locale e di una variabile di istanza possono sovrapporsi all’oggetto • n n Campi statici (anche costanti statiche) • q Annalisa De Bonis alla classe • Es.: contoMaria.getBalance(); Visibilita` sovrapposte n q Es.: Math.sqrt, Math.PI; Il nome dell’oggetto se si tratta di una variabile o un metodo di istanza Esempio: public class Coin { public void draw(Graphics2D g2) { String name = "SansSerif"; // variabile locale g2.setFont(new Font(name, . . .)); /* qui name si riferisce alla variabile locale */ g2.drawString(this.name, . . .); /* qui name si riferisce alla variabile di istanza */ } private String name; // variabile di istanza ... } Annalisa De Bonis Linguaggi di Programmazione II 2003-04 41 3 PDF created with pdfFactory Pro trial version www.pdffactory.com Gli Identificatori in Java I nomi dei pacchetti -1 nTutti gli identificatori (variabili, metodi, classi, package, ….) in java seguono le stesse convenzioni del C : q nSiccome dinamicamente via Internet, è assolutamente necessario avere un meccanismo che garantisca l’unicità dei nomi Possono essere costituiti da n n n Java può usare anche classi caricate delle classi e dei package. Lettere Numeri Carattere di underscore (_) nSe i nomi dei package sono unici, allora sono unici anche i nomi delle classi perché due classi con lo stesso Non possono iniziare con un numero q Non possono essere parole chiave di java q nome in due package diversi hanno nomi completi diversi. Linguaggi di Programmazione II 2003-04 Annalisa De Bonis 42 Alcuni pacchetti fondamentali della libreria Java Scopo Classi campione n I nomi dei pacchetti non devono essere ambigui java.lang Supporto al linguaggio Math n Consiglio: usare I nomi dei domini Internet alla rovescia java.util Utility Random java.io Input/output PrintStream java.awt Abstract Windowing Toolkit (Interfacce grafiche) Color java.applet Applet Applet java.net Connessione di rete Socket q java.sql Accesso a Database ResultSet Interfaccia utente Swing JButton org.omg.CORBA Common Object Request Broker Architecture ORB Linguaggi di Programmazione II 2003-04 it.unisa.mypackage Il nome del pacchetto deve coincidere con il percorso della sottocartella dove è ubicato il pacchetto q Esempio: il pacchetto com.horstmann.bigjava deve essere ubicato nella sottocartella: com/horstmann/bigjava n 43 Il percorso della sottocartella è specificato a partire dalla classe di base Annalisa De Bonis Linguaggi di Programmazione II 2003-04 46 I nomi dei pacchetti -3 Posizionare le classi nei pacchetti Il file deve cominciare con : package packagename; In generale una persona non è l’unico utente di un dominio Internet, per cui è bene ricorrere all’indirizzo di e-mail. n q Esempio : package com.horstmann.bigjava; public class Numeric { ... } n Esempi: com.horstmann.bigjava n javax.swing 45 I nomi dei pacchetti -2 Package Annalisa De Bonis n Linguaggi di Programmazione II 2003-04 Annalisa De Bonis q Esempio : [email protected] diventa it.unisa.dia.debonis Se non è diversamente specificato dallo statement package, le classi create da un programmatore vanno a costituire un package di default. Annalisa De Bonis Linguaggi di Programmazione II 2003-04 44 Annalisa De Bonis Linguaggi di Programmazione II 2003-04 47 4 PDF created with pdfFactory Pro trial version www.pdffactory.com Localizzazione dei package -1 Localizzazione dei package -3 nSe vogliamo che Java cerchi i file componenti un package a partire da una particolare directory, possiamo q assegnare il suo path assoluto alla variabile di ambiente CLASSPATH Java localizza i file contenenti le classi di un package mediante un’associazione tra il nome del package e la posizione dei file nel filesystem. n Le parti separate da punti che compongono il nome di un package devono corrispondere ai nomi delle directory che compongono il path della directory contenente i file in questione, a partire dalla directory corrente o da una directory specifica. n n q q 48 Localizzazione dei package -2 nSupponiamo Tutte le volte che importo classi non standard la ricerca parte da /home/debonis/esercizi Comodo ma non garantito su tutti i sistemi e/o tutte le installazioni del JDK Usare l’opzione -classpath del compilatore javac (garantito) n Linguaggi di Programmazione II 2003-04 Annalisa De Bonis CLASSPATH=/home/debonis/esercizi: q javac -classpath /home/debonis/esercizi Numeric.java Annalisa De Bonis che la directory corrente sia /home/debonis e n Si puo` sempre usare una classe senza importarla q it.unisa.debonis file che compongono il package devono stare nella n sottodirectory it/unisa/debonis della directory corrente, cioè in /home/debonis/it/unisa/debonis Linguaggi di Programmazione II 2003-04 49 Cartella di base e sottocartelle per i pacchetti Esempio: java.awt.Rectangle r = new java.awt.Rectangle(6,13,20,32); Per evitare di usare nomi qualificati possiamo usare lo statement import q Annalisa De Bonis 51 Importare pacchetti -1 che in un file .java vogliamo importare il package nI Linguaggi di Programmazione II 2003-04 Esempio: import java.awt.Rectangle; ... Rectangle r = new Rectangle(6,13,20,32); Annalisa De Bonis Linguaggi di Programmazione II 2003-04 Importare pacchetti n Cartella di base 52 -2 Si possono importare tutte le classi di un pacchetto q Esempio: import java.awt.*; home Il percorso corrisponde al nome del pacchetto debonis n it Nota: non c’e` bisogno di importare java.lang per usare le sue classi unisa debonis Annalisa De Bonis Linguaggi di Programmazione II 2003-04 50 Annalisa De Bonis Linguaggi di Programmazione II 2003-04 53 5 PDF created with pdfFactory Pro trial version www.pdffactory.com Il Problema della Collisione Differenze tra import e #include nSe nL’istruzione importiamo due package che contengono entrambi una certa classe Myclass, un riferimento a Myclass nel codice genera una collisione sul nome Myclass. q n questo caso il compilatore chiede di usare i nomi completi per evitare ambiguità. n q i package pack1 e pack2, ci riferiremo alle classi Myclass come q q 54 import di java È una semplificazione per specificare il nome di una classe n e pack2.Myclass Linguaggi di Programmazione II 2003-04 prototipi di funzioni e costanti definite dal programmatore Bisogna utilizzarla per forza almeno per la libreria standard nL’istruzione nDati Annalisa De Bonis prototipi delle funzioni di libreria e costanti predefinite oppure nIn npack1.Myclass #include del C e del C++ è una direttiva al preprocessore per inserire all’interno del sorgente un file contenente Non include niente nel file sorgente, dice solo dove si trova la classe È possibile non usarla mai Annalisa De Bonis Linguaggi di Programmazione II 2003-04 57 Convenzioni sui nomi Il Significato di import nL’istruzione import dice soltanto al compilatore dove si trova un certo package o una certa classe. Per convenzione i nomi delle classi iniziano con lettera maiuscola, quelli dei package con lettera minuscola. n I nomi dei package in genere sono formati da identificatori separati da punti n nPer ogni riferimento ad una classe Myclass, che non faccia parte dello stesso package del file che stiamo compilando, il compilatore controlla solo l’esistenza del file Myclass.class nella locazione specificata da import. Annalisa De Bonis Linguaggi di Programmazione II 2003-04 55 Annalisa De Bonis Linguaggi di Programmazione II 2003-04 58 Caricamento di Classi Importate nLe classi importate, tramite l’istruzione import o specificando il loro nome completo, vengono caricate dal Class Loader in run-time. nFinché il codice non fa un riferimento esplicito ad una classe che è stata importata, la classe non viene caricata. Annalisa De Bonis Linguaggi di Programmazione II 2003-04 56 6 PDF created with pdfFactory Pro trial version www.pdffactory.com