1 I metodi statici -1 I metodi statici -2 Il metodo main Variabili statiche

annuncio pubblicitario
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
Scarica