Classi e oggetti

I dati che possono essere manipolati in un programma Java si dividono in

  • elementi dei tipi di dati primitivi, e

  • oggetti.

Una classe definisce una collezione di oggetti, le possibili istanze della classe.

Si possono creare oggetti (istanze) di una classe con la primitiva new.

Si possono manipolare gli oggetti invocando su di essi i metodi d'istanza, che sono definiti nella classe.

Ogni classe definisce un tipo di dati, i cui elementi sono le sue istanze. Quindi possiamo dichiarare variabili il cui tipo è una classe, e potremo assegnargli solo oggetti di quella classe.

Il linguaggio Java comprende un gran numero di classi predefinite, e fornisce al programmatore i meccanismi necessari per definirne di nuove.




Esempio di oggetti: rettangoli

Tra le centinaia di classi fornite da Java, la classe java.awt.Rectangle definisce degli oggetti che rappresentano dei rettangoli.

Ogni rettangolo (istanza della classe) ha quattro variabili d'istanza, i cui valori rappresentano la dimensione del rettangolo (height e width) e la posizione nel piano del suo vertice superiore sinistro (x e y).

Ad esempio, in un programma possiamo creare tre rettangoli con opportuni valori per le variabili d'istanza. Ogni oggetto viene rappresentato da uno scatolotto avente in alto il nome della classe, e sotto le variabili d'istanza.

Rappresentazione grafica dei tre oggetti a sinistra.




Un semplice programma

Vogliamo scrivere un programma che:
  • Crea un rettangolo di coordinate x = 5 e y = 10 e di dimensioni height = 20 e width = 30;

  • Stampa lo stato del rettangolo;

  • Sposta il rettangolo di 15 unità lungo l'asse x e di 25 lungo l'asse y;

  • Stampa il nuovo stato del rettangolo.

Consultando la documentazione della classe Rectangle [locale, Medialab, Sun] vediamo come costruire un rettangolo con i valori desiderati per la variabili d'istanza, e che esiste un metodo d'istanza translate. Il programma risultante è il seguente:

import java.awt.Rectangle;

public class MoveRectangle {

    public static void main(String[] args) {
        Rectangle rect;
        rect = new Rectangle(5, 10, 20, 30);
        System.out.println(rect);
        rect.translate(15, 25);
        System.out.println(rect);
   }

}




Analizziamo il programma

Dichiariamo di voler usare la classe Rectangle del package java.awt:
import java.awt.Rectangle;
     ...

Dichiariamo una variabile rect di tipo Rectangle e le assegnamo un nuovo oggetto con i valori desiderati per le variabili d'istanza:
     ...
public class MoveRectangle {

    public static void main(String[] args) {
        Rectangle rect;
        rect = new Rectangle(5, 10, 20, 30);
     ...


Stampiamo lo stato del rettangolo:
     ...
        System.out.println(rect);
     ...

Output: java.awt.Rectangle[x=5,y=10,width=20,height=30]

Invochiamo il metodo d'istanza translate sull'oggetto rect per spostarlo della quantità voluta:
     ...
        rect.translate(15, 25);
     ...


Infine stampiamo lo stato finale:
     ...
        System.out.println(rect);
   }
}

Output: java.awt.Rectangle[x=20,y=35,width=20,height=30]


Importante: per invocare un metodo d'istanza su di un oggetto si scrive

<oggetto>.<metodo>(<parametri>)