Programmazione ad Oggetti: cos’è? [Java]

A chi è rivolto quest’articolo?

Quest’articolo è rivolto a chi già sa programmare un po’, ma non ad oggetti. Per esempio qualcuno in grado di programmare in C o in altri linguaggi, incuriosito dai linguaggi di programmazione ad oggetti.

I nuovi di Java o quelli che vogliono provare gli esempi in quest’articolo sappiano che dovrete includere il codice degli esempi dentro un file chiamato Esempio.java così fatto:

class Esempio {
  public static void main(String[] args) {
    // Il codice degli esempi va qui
  }
}
// il codice di altre classi invece va qui

NB: Il nome del file deve essere uguale al nome che segue “class” nel codice.

Com’era prima della programmazione ad oggetti

Prima della programmazione ad oggetti il codice era molto poco strutturato; infatti la maggior diversità nella programmazione ad oggetti sta tutta nell’organizzazione e nella struttura del programma.

Ad esempio in C tutta la “struttura” stava nel poter dividere il programma in diversi file, e in ciascun file si potevano avere diverse funzioni.

Com’è ora con la programmazione ad oggetti

Ora c’è un modo in più per strutturare un programma, grazie alle Classi. Le classi sono molto legate agli oggetti, e spesso si tende a confondere gli uni con le altre, ma tra poco scopriremo cosa li differenzia. Per ora basti sapere che nella programmazione ad oggetti le novità sono portate dalle parole Classe, Oggetto, Istanza.

Ma che cosa fa la programmazione ad oggetti?

Da wikipedia: “La programmazione ad oggetti prevede di raggruppare in una zona circoscritta del codice sorgente (chiamata classe) la dichiarazione delle strutture dati e delle procedure che operano su di esse. Le classi, quindi, costituiscono dei modelli astratti, che a tempo di esecuzione vengono invocate per instanziare o creare oggetti relativi alla classe invocata.”

In sostanza utilizzare la programmazione ad oggetti ci permette di avere un livello di astrazione più alto, e di non pensare quindi agli aspetti di basso livello/implementativi. Questo punto lo approfondiremo meglio quando parleremo di Ereditarietà.

Cos’è una Classe?

Una Classe la potete vedere come un insieme di funzioni e variabili associate. Se provenite da un linguaggio come il C, allora la struct è ciò che più si avvicina al concetto di Classe.

Penso tuttavia che con il codice si capisca molto di più che con le parole, vediamo quindi subito un esempio in Java.

class Cane {
  public String nome = "Nessuno";
  public void abbaia() {
    System.out.println("BAU!");
  }
}

Qui definiamo una classe con la parola chiave class. All’interno abbiamo due parti: la definizione di una variabile di tipo String (che è il tipo char* del C)  chiamata nome, a cui assegnamo di default il valore “Nessuno”, e la definizione di una funzione abbaia, che non ritorna nessun valore (void) e altro non fa che stampare a video la stringa “BAU!” con la funzione System.out.println (l’equivalente della printf del C).

Una delle cose che non abbiamo ancora visto è la parola chiave public. Questa dice a Java che la funzione e la variabile sono entrambe “pubbliche”, accessibili a chiunque voglia usarle. Per una variabile ciò significa che essa può venir letta e scritta da chiunque, mentre per una funzione ciò significa che questa può essere semplicemente chiamata da chiunque. Non approfondiremo ulteriormente questo aspetto in quest’articolo perché non troppo rilevante mentre si impara la programmazione ad oggetti, sappiate solo che esistono altre parole chiave (come private) che rendono le variabili o le funzioni non modificabili/chiamabili da tutti.

Come usare una classe: Oggetti

Fino ad ora abbiamo visto una semplice classe, ma come possiamo usarla? Infatti se provate a compilare il codice sopra, non avrete alcun output. Dobbiamo istanziare la classe.

Cosa significa istanziare? Le classi sono mera struttura, da sole non fanno nulla. Dovete immaginare una classe come un progetto di un palazzo: dice la struttura, ma non è esso stesso la casa! Come creiamo la casa? Dobbiamo crearla (mattone su mattone) guardando il progetto. Analogamente per istanziare (creare) un oggetto (casa) bisogna guardare alla classe (progetto). Quest’immagine ci fa capire meglio la differenza tra classe e istanza:

Programmazione ad Oggetti

Vediamo quest’esempio in Java:

Cane fuffi = new Cane();

Come ogni variabile definiamo prima di tutto il tipo della variabile, che non è int o String ma Cane, poi il nome fuffi, e fino a qui tutto quasi normale. L’istanziare la classe viene subito dopo l’uguale: la parola chiave new seguita dal nome di una classe, crea/istanzia l’oggetto a partire dalla classe.

Cosa ci facciamo ora?

fuffi.abbaia();

per esempio possiamo fargli stampare a video “BAU!” con questa funzione. Notare che la funzione è diventata di fuffi, non di Cane! Volendo possiamo anche rinominare il nostro fuffi:

fuffi.nome = "Fuffi";

Qual è il vantaggio delle classi? Potevo fare semplici funzioni!!

Vero per quello che abbiamo visto ora. Vediamo un esempio della classe Cane modificata.

class Cane {
  public String nome = "Nessuno";
  public void abbaia() {
    System.out.println("BAU, sono "+nome+"!");
  }
}

Se ora chiamate fuffi.abbaia(), avrete un output “personalizzato”. Potrete creare n oggetti della stessa classe, assegnare nomi diversi, ed usare gli oggetti tutti allo stesso modo, sebbene siano diversi!

 Cane fuffi = new Cane();
 fuffi.nome = "Fuffi";
 Cane pepe = new Cane();
 pepe.nome = "Pepe";
 fuffi.abbaia();
 pepe.abbaia();

Questo codice darà come output:

BAU, sono Fuffi!
BAU, sono Pepe!

Passaggio di Parametri alla classe: i Costruttori

Ora proviamo a creare un esempio poco più complesso, introducendo i costruttori. Questi sono delle funzioni che vengono chiamate automaticamente non appena un oggetto viene istanziato.

class ContoCorrente {
  private int saldo = 0;

  public ContoCorrente(int saldo_iniziale) {
    saldo = saldo_iniziale;
  }

  public boolean prelievo(int soldi_da_prelevare) {
    if(soldi_da_prelevare>saldo) {
      System.out.println("Saldo="+saldo+" insufficiente.");
      return false;
    } else {
      saldo=saldo-soldi_da_prelevare;
      return true;
    }
  }
}

Questa classe potrà essere usata nel modo seguente:

ContoCorrente conto = new ContoCorrente(10000);

Come vedete è molto semplice, funziona allo stesso modo del passaggio parametri ad una funzione.

NB: Il costruttore esiste sempre, e se non è definito esplicitamente allora è semplicemente una funzione che non esegue nulla.

Me stesso: this

Spesso e volentieri vi ritroverete ad utilizzare delle parole chiavi come this, self o simili, dipendentemente dal linguaggio. Java utilizza this. Che cos’è this? This identifica l’oggetto corrente, ossia l’oggetto dentro al quale si è.

Se in un metodo di una classe scrivo:


this.conto = 5;

Significa che imposto a 5 la variabile conto dell’oggetto corrente. Spesso viene utilizzato per evitare ambiguità.

Esempio di prima utilizzando this:

class ContoCorrente {
  private int saldo = 0;

  public ContoCorrente(int saldo) {
    this.saldo = saldo;
  }

  public boolean prelievo(int saldo) {
    if(soldi_da_prelevare>saldo) {
      System.out.println("Saldo="+saldo+" insufficiente.");
      return false;
    } else {
      saldo=saldo-soldi_da_prelevare;
      return true;
    }
  }
}

Variabili d’istanza vs Variabili di Classe: static

All’interno di una classe possiamo definire delle variabili d’istanza, come “conto” dell’esempio precedente. Queste sono variabili che saranno presenti con diversi contenuti in ogni istanza (da qui il nome).

Esistono però altre variabili, dette variabili di Classe, o Statiche. Esse non sono presenti in ogni oggetto, ma sono presenti soltanto nella classe. In java con la keywork static si crea una variabile di classe. Tranquilli, con un esempio si chiarisce tutto.

class Automobile {
  public static int numeroAuto = 0;
  public int km = 0;

  public Automobile() {
    numeroAuto += 1;
  }
}

// e da qualche parte:

Automobile autoNuova = new Automobile();
Automobile autoUsata = new Automobile();
autoUsata.km = 3000;
System.out.println(autoNuova.km+" km");
System.out.println(autoUsata.km+" km");
System.out.println(Automobile.numeroAuto+" automobili");

Come potete vedere, per riferirmi ai chilometri dell’auto utilizzo proprio l’oggetto autoNuova o autoUsata, mentre per ottenere il numero di auto devo utilizzare la classe Automobile.

Così come esistono variabili di istanza e statiche, esistono anche metodi di istanza e statici. Il main in java è un esempio di metodo statico.

A breve uscirà il seguito, che renderà un po’ più chiaro il vantaggio delle classi e che spiegherà concetti più complessi, come l’Incapsulamento, l’Ereditarietà, e il Polimorfismo, tipici di ogni linguaggio di programmazione ad oggetti.

Seguiteci anche su Facebook, Google Plus, Tumblr e Twitter, per restare sempre in contatto con noi e con le nostre guide.



Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Cerca

Seguici

Live da Facebook
Live da Twitter
Seguici su Telegram
Canale InsiDevCode Telegram