/* *************************************************************************
 * Abbiamo visto come le classi siano una definizione astratta degli
 * oggetti da istanziare, i quali poi avranno ognuno una copia personale
 * sia dei metodi che delle variabili, per cui scrivendo in una variabile
 * di un oggetto, non si cambia il valore delle copie di quella variabile
 * negli altri oggetti istanza della stessa classe. Infatti se scriviamo
 * in cane1.numerozampe non si modifica cane2.numerozampe, essendo queste
 * due variabili indipendenti, e tra l'altro inaccessibili dall'esterno
 * del proprio oggetto, essendo private.
 * Pero' tale variabile si puo' definire statica, ossia si puo' fare in
 * modo che tale variabile esista al massimo in una copia, anche se si
 * istanziano svariati oggetti. In questo modo, tale variabile sara'
 * condivisa da tutti gli oggetti istanziati dalla classe, e scrivere
 * in essa da uno degli oggetti significhera' cambiarne il valore in tutti
 * gli altri. Per dichiarare statica una variabile, basta usare "static":
 *
 * static int numerozampe;
 *
 * Vediamo il suo uso.
 ************************************************************************ */

import java.io.*;         // Include le funzioni I/O standard di base.


/* ********************************************************************** */

public class Jlez10a {            // Da qua inizia la classe Jlez10a

///////////////////////////////////////////////////////////////////////////
//                            Il main...
///////////////////////////////////////////////////////////////////////////

 public static void main(String args[])  // Definiamo il metodo Main.
 {                                       // Inizio del main()

// Istanzio 2 oggetti della classe animale

    animale cane1 = new animale();
    animale cane2 = new animale();

// Azzeriamo usando i 2 mettizampe (come se numerozampe non fosse static).

    cane1.mettizampe(0);       // Azzeriamo
    cane2.mettizampe(0);       // Non servirebbe, gia' azzerato prima.

// Scriviamo 40 in cane1.numerozampe

   cane1.mettizampe(40);       // In realta' abbiamo modificato anche cane2.

// Verifichiamo che la variabile, essendo static, e' una sola, condivisa,
// infatti sia cane1 che cane2 risulteranno avere 40 zampe.

   System.out.println("\nStato del cane1: zampe = " + cane1.leggizampe());
   System.out.println("Stato del cane2: zampe = " + cane2.leggizampe());

 }               // Fine del metodo principale Main()

}            // Fine della classe Jlez10a


/* *************************************************************************
 * Definiamo la classe animale. Generera' il file animale.class.
 * Il compilatore dara' un warning (attenzione) perche' sarebbe preferibile
 * separare il listato della classe e compilarlo a parte in un file
 * chiamato animale.java. Comunque la compilazione avviene lo stesso.
 ************************************************************************ */

class animale {         // Definisco la classe animale

    private static int numerozampe=0;    // Variabile privata STATICA


// Ora scriviamo i metodi pubblici della classe animale:

/*-------------------------------------------------------------------------*
 * mettizampe: definisce il numero di zampe dell'animale.
 *             parametri: in entrata il num. di zampe in formato int.
 *-------------------------------------------------------------------------*/

 public void mettizampe(int l)
 {
    numerozampe = l; // Scrive il valore nella variabile privata "numerozampe".
 }


/*-------------------------------------------------------------------------*
 * leggizampe: legge e restituisce il num. di zampe dell'animale.
 *             parametri: in uscita il num. di zampe in formato int.
 *-------------------------------------------------------------------------*/

 public int leggizampe()
 {
    return numerozampe;
 }

}            // Fine della classe animale


/* *************************************************************************
 * Fate molta attenzione all'uso di static, perche' cambia molto la logica
 * di funzionamento delle classi. Se non sapeste che numerozampe e'
 * static, leggendo solo il main vi aspettereste un risultato diverso.
 ************************************************************************ */