Classi Standard e Packages

Il linguaggio Java fornisce al programmatore molte classi predefinite. Tali classi sono raggruppate in packages (cioè directory che sono organizzate gerarchiamente) ed il loro numero elevatissimo è in continuo aumento con il rilascio delle nuove versioni del JDK.

Se un programma usa una classe chiamata <Class> del package <pack> (diverso da java.lang) deve importarla esplicitamente con un comando import all'inizio del file:
 

import <pack>.<Class>;

// Esempio:
import java.awt.Rectangle;

// importa la classe: può usare tutto
// ciò che è dichiarato public nella classe
import <pack>.*;

// Esempio:
import java.awt.*;
import java.io.*;

// importa tutte le classi di <pack>

Eccezioni

  • Ogni programma importa automaticamente tutte le classi del proprio package (directory). Inoltre di tali classi vede tutte le variabili, i metodi e i costruttori che non sono dichiarati private (quinid quelli public, protected, e quelli senza modificatore di visibilità).
  • Il package java.lang è importato automaticamente in ogni programma.
Per una lista dei packages del JDK, si veda [locale, Medialab, Sun]. 



La classe Object

La classe  Object è quella dalla quale discendono per default tutte le altre classi, per cui i suoi metodi sono disponibili in tutti gli oggetti grazie al meccanismo dell'ereditarietà  (inheritance).

Alcuni metodi forniti dalla classe Object, e quindi invocabili su qualunque oggetto Java:
 
 

public boolean equals (Object obj)
Concettualmente, equals restituisce true se il contenuto  di due oggetti è uguale (non il riferimento, come per l'operatore ==). Si richiede che implementi una relazione di equivalenza, quindi che goda delle proprietà di riflessività, simmetria, transitività e consistenza.  Deve essere ridefinito in tutte le classi su cui è necessario effettuare confronti.


Il metodo equals della classe Object, non potendo fare alcuna assunzione sulla struttura interna degli oggetti su cui viene invocato, utilizza semplicemente l'operatore == per confrontarli. 


Quindi attenzione: se equals viene usato in una classe senza essere ridefinito, non da errore in esecuzione, ma il risultato potrebbe essere incorretto.
public String toString ()
Restituisce una stringa che può essere considerata come la "rappresentazione testuale" dell'oggetto su cui è invocato (da usare ad esempio nella stampa). Deve essere ridefinito in ogni classe che lo usa, per ottenere un risultato significativo (tipicamente, di un oggetto si vogliono stampare i valori delle variabili d'istanza, ed eventualmente una intestazione).


La definizione default del metodo in Object restituisce il una stringa del tipo <classe>@<hashcode>, dove <classe> è il nome della classe dell'oggetto su cui è invocato, e <hashcode> è la rappresentazione esadecimale del codice hash dell'oggetto.

Descrizione completa della classe Object: [locale, Medialab, Sun]
 




La classe String

Le istanze di String sono stringhe, cioè sequenze di caratteri non modificabili. Istanze di String si possono creare con la solita notazione (sequenza di caratteri tra doppi apici ("")) o con i costruttori della classe, tra cui
 
public String () // crea una stringa vuota
public String (char[] value) // crea una stringa che contiene 
// i caratteri di value
public String (StringBuffer buffer) // trasforma una stringa modificabile 
// (vedi sotto) in una non modificabile

Alcuni metodi da conoscere:
 

public boolean 
   equals (Object obj)
/* restituisce true se le
due stringhe sono uguali */
public boolean 
   equalsIgnoreCase (String str)
/* come equals, ignorando 
differenza tra maiuscole e minuscole */
public int 
   compareTo (String str)
/* confronta le stringhe rispetto 
all'ordinamento lessicografico */
public char 
   charAt (int i)
/* restituisce  l'i-esimo carattere 
contenuto nella stringa: i deve essere
compreso tra 0 e la lunghezza della 
stringa (str.lenght() - 1) */
public String 
    substring (int i, int j)
/* restituisce la sottostringa contenente
i caratteri dalla posizione i alla 
posizione j-1 */
public int 
   indexOf (String str)
/* restituisce l'indice da cui parte la
prima sottostringa uguale a str
restituisce -1 se non esiste */

Descrizione completa della classe String: [locale, Medialab, Sun]




La classe StringBuffer

La classe StringBuffer è simile a String  ma implementa stringhe modificabili nel contenuto e nella lunghezza.
 
Costruttori
public StringBuffer () /* crea uno StringBuffer vuoto, 
con lunghezza iniziale 16 (default) */
public StringBuffer (int lenght) /* idem, con lunghezza iniziale 
length */
public StringBuffer (String str) /* contenuto iniziale: str. Consente 
di usare indirettamente i costruttori della 
classe  String */

 
Alcuni metodi
public String toString() /* restituisce la stringa corrispondente
al suo contenuto  */
public StringBuffer append (int i)
public StringBuffer append (double b)
public StringBuffer append (boolean b)
...
public StringBuffer append (Object obj)
/* concatena la rappresentazione 
testuale dell'argomento al proprio 
contenuto */
public StringBuffer 
    insert (int offset, int i)
...
/* inserisce la rappresentazione 
testuale dell'argomento a partire
dalla posizione offset */
 



Concatenazione di stringhe


La classe StringBuffer non è molto usata in modo esplicito dai  programmatori, ma lo è dal compilatore Java. In particolare, i metodi append sono utilizzati dal compilatore per implementare l'operatore di concatenazione di stringhe'+'.
 
 
Esempio
I comando
 x = "a" + 4 + 'c';
viene compilato come se fosse l'espressione

x = new StringBuffer().append("a").append(4).append('c').toString()

che crea un oggetto di classe StringBuffer vuoto, quindi ci concatena in sequenza "a", 4 e 'c', e infine restituisce la stringa corrispondente.

Descrizione completa della classe StringBuffer: [locale, Medialab, Sun]




La classe Vector

La classe  java.util.Vector  definisce degli oggetti, chiamati vettori, che sono simili agli array. Le differenze principali sono due:
  • la dimensione di un vettore può variare durante l'esecuzione di un programma;
  • i vettori possono contenere elementi di un solo tipo: Object.
L'implementazione dei vettori è basata sugli array. Al momento della creazione di un vettore, viene inizialmente utilizzato un array di dimensioni predefinite. Successivamente, se la capacità dell'array non è più sufficiente, viene creato un nuovo array più grande nel quale vengono copiati tutti gli elementi del vecchio.

I costruttori permettono di specificare la capacità iniziale (initialCapacity) e il valore da usare per aumentare la  capacità (capacityIncrement)quando necessario. Se (capacityIncrement == 0), il nuovo array avrà capacità doppia rispetto all'attuale.
 
 

Costruttori
public Vector 
    (int initialCapacity, 
     int capacityIncrement)
/* crea un Vector con i parametri 
specificati */
public Vector 
    (int initialCapacity)
/* per default, capacityIncrement==0. */
public Vector () /* per default, initialCapacity==10
capacityIncrement==0 */
 



Vector: contenuto e metodi

I vettori possono contenere solo istanze della classe Object. Ma in Java, tutte le classi ereditano dalla classe Object, quindi un oggetto di una qualunque classe è anche un oggetto di Object. Di conseguenza gli elementi di un vettore possono essere arbitrari oggetti Java.

Attenzione: Questo esclude i valori dei tipi di dati primitivi: un vettore non può contenere un int, o un boolean, o un double, ...
Se si vuole inserire uno di questi elementi occorre utilizzare la corrispondente classe contenitore (o involucro, wrapper).
 

Alcuni metodi
public int capacity () /* restituisce la capacità  */
public int size () /* restituisce il numero di elementi 
contenuti nel vettore */
public void addElement
     (Object obj)
/* aggiunge obj dopo l'ultimo elemento */
public void  insertElementAt
     (Object obj, int index)
/* inserisce obj nella posizione index  */
public void  setElementAt
     (Object obj, int index)
/* sostituisce obj all'oggetto della 
posizione index  */
public void  removeElementAt
     (int index)
/* rimuove l'oggetto presente nella 
posizione index  */
public boolean removeElement
     (Object obj)
/* rimuove l'oggetto obj se presente 
restituendo true, oppure restituisce false  */
public Object elementAt
     (int index)
/* restituisce l'elemento di indice index  */
Esempio: EsVettore.java
Descrizione completa della classe Vector: [locale, Medialab, Sun]



Uso di classi Contenitore 
(involucro, wrappers)

In Java i valori dei tipi di dati primitivi (booleani, numerici, caratteri) non sono visti come oggetti.

Vi sono alcune situazioni in cui è necessario poter considerare elementi di tipi primitivi come oggetti (ad esempi lavorando con la classe Vector, le cui istanze sono delle sequenze di oggetti).
 

Vector vett = new Vector();
int num = 123;
vett.addElement(num);
>javac ProvaVett.java
ProvaVett.java:7:
addElement(java.lang.Object)
in java.util.Vector cannot
be applied to (int)
 vett.addElement(num);
     ^

Per questo ed altri casi, Java definisce nel package java.lang alcune classi contenitore. Le loro istanze sono usate per incapsulare valori primitivi in un oggetto. Questo permette di trattare in maniera omogenea tipi primitivi ed oggetti.
 

Vector vett = new Vector();
int num = 123;
Integer intObj = new Integer(num);
vett.addElement(intObj);
// funziona



Le classi Contenitore

Ci sono classi contenitore per tutti i tipi primitivi, ad alcune altre. Normalmente hanno un nome simile al corrispondente tipo primitivo, ma iniziano con maiuscola:
    Bignum, Boolean, Byte, Character, Double, Float, Integer, Long, Number, Short
Ciascuna di queste classi ha (oltre ai soliti metodi toString e equals):
  • un costruttore con parametro di tipo primitivo (ad esempio Character(char c) o Integer(int value));
  • un costruttore con parametro String (ad esempio Integer(String s));
  • un metodo <tipo>Value che produce il valore di tipo primitivo corrispondente (ad esempio intValue());
Si veda ad esempio la classe Integer: [locale, Medialab, Sun]



La classe Math


La classe  Math contiene metodi e costanti utili per il calcolo di funzioni matematiche.

Alcune costanti definite e funzioni matematiche implementate dai metodi della classe:

  • E ( 2.7182818284590452354), PI (3.14159265358979323846)
  • sin, cos, tan e le inverse
  • exp (esponenziale), log (logaritmo), sqrt (radice quadrata), pow (elevamento a potenza)

  • round (arrotondamento), random (numero casuale), abs (valore assoluto), min, max.
Descrizione completa della classe Vector: [locale, Medialab, Sun]



Documentazione su Java: API 


Dove si può trovare la documentazione completa delle classi della distribuzione di Java, con elenco di metodi, variabili, costruttori ecc.?
 
Java 1.3 API  (Application Programming Interface)
{disponibile sul CD}
Descrizione di tutti i packages e tutte le classi della distribuzione standard di Java. Per ogni classe sono elencate le variabili e i metodi che contiente, con una breve descrizione delle funzionalià.

Utile per trovare risposte a domande come: Come si chiama il metodo della classe Math che calcola l'elevamento a potenza? e quali argomenti si aspetta? In quale package è definita la classe Rectangle? e quali metodi fornisce?

Link:  [locale, Medialab, Sun]