/* *************************************************************************
* Spesso prima di usare una classe occorre inizializzarla, ad esempio
* puo' servire di azzerare certe variabili, o allocare della memoria.
* Allo stesso modo, quando la classe non serve piu', puo' dover essere
* eseguita qualche operazione di deallocazione della memoria o simili.
* Cio' si puo' fare scrivendo un metodo che esegua tali funzioni, ma
* dovremo eseguirlo ogni volta che l'oggetto viene creato:
*
* animale cane1 = new animale(); // Ecco che istanzio un animale...
*
* cane1.inizializ(); // Chiamiamo il metodo inizializ() di cane1
*
* Ci sono 2 inconvenienti: uno e' quello di doversi ricordare ogni volta
* di chiamare il metodo, col rischio di dimenticarselo e far impazzire
* tutto; l'altro e' quello di dover ripetere l'operazione meccanicamente
* per tutti gli oggetti, che possono essere anche decine.
* Di conseguenza sono stati implementati dei costruttori "automatici",
* che vengono chiamati alla dichiarazione dell'oggetto senza dover
* intervenire, e senza che ce ne accorgiamo, a meno che non stampino
* messaggi.
* Il costruttore e' un metodo speciale che ha lo stesso nome della classe:
*
* animale() {...} // Costruttore
*
* Da notare che il costruttore non puo' restituire alcun valore, per cui
* non si fa precedere dal tipo di restituzione (nemmeno da void):
*
* class animale { // Definisco la classe animale
*
* private float lunghezza; // Le variabili private
* private int numerozampe;
*
* animale() { // Il costruttore. Non ha parametri in entrata
* lunghezza = 0;
* numerozampe = 0;
* System.out.println("animale inizializzato");
* } // Fine costruttore
* ... // Altri metodi
* } // Fine classe
*
* Nel nostro esempio stampiamo una stringa, ma questo solo per rendere
* visibile il momento dell'esecuzione del costruttore.
* Il costruttore viene eseguito quando l'oggetto e' istanziato con "new".
* Raramente stamperemo inutili messaggi come questi, nella pratica.
************************************************************************ */
import java.io.*; // Include le funzioni I/O standard di base.
/* ********************************************************************** */
public class Jlez7c { // Da qua inizia la classe Jlez7c
///////////////////////////////////////////////////////////////////////////
// Il main...
///////////////////////////////////////////////////////////////////////////
public static void main(String args[]) // Definiamo il metodo Main.
{ // Inizio del main()
// Ora possiamo dichiarare alcuni oggetti di tipo animale. Durante la
// loro allocazione (tramite new) vengono eseguiti i metodi costruttori
animale cane1 = new animale(); // ecco che dichiaro 3 animali
animale cane2 = new animale(); // ossia creo degli esemplari dalla
animale millepiedi = new animale(); // classe "astratta"
/// Ora dobbiamo mandare un messaggio all'oggetto chiedendogli di modificare
// la sua variabile.
cane1.mettizampe(4); // Chiamiamo il metodo mettizampe() di cane1
cane2.mettizampe(4); // e quello di cane2, per variare le loro
millepiedi.mettizampe(1000); // variabili private. Stesso per millepiedi
// Gli altri parametri li chiediamo all'utente.
System.out.println("\nLunghezza cane 1?");
cane1.mettilungh(leggiFloat()); // Passa a mettilungh il valore letto.
System.out.println("Lunghezza cane 2?");
cane2.mettilungh(leggiFloat()); // Passa a mettilungh il valore letto
System.out.println("Lunghezza millepiedi?");
millepiedi.mettilungh(leggiFloat());
System.out.println("Num. esatto piedi del millepiedi?");
millepiedi.mettizampe(leggiInt()); // Passa a mettizampe il val. letto.
// Ora visualiziamo lo stato degli animali, usando i loro metodi di lettura.
System.out.print("\nStato del cane1: zampe = " + cane1.leggizampe());
System.out.println(", lunghezza = " + cane1.leggilungh());
System.out.print("\nStato del cane2: zampe = " + cane2.leggizampe());
System.out.println(", lunghezza = " + cane2.leggilungh());
System.out.print("\nStato del millepiedi: zampe = " + millepiedi.leggizampe());
System.out.println(", lunghezza = " + millepiedi.leggilungh());
} // Fine del metodo principale Main()
/* -------------------------------------------------------------------------
* Definiamo un metodo chiamato leggiInt(), che in entrata non ha
* parametri, e in uscita restituisce un numero intero immesso da tastiera.
* int leggiInt()
* ----------------------------------------------------------------------- */
public static int leggiInt()
{
try {
DataInputStream leggilo = new DataInputStream(System.in);
String stringa = leggilo.readLine(); // dichiaro e leggo stringa.
return(Integer.valueOf(stringa).intValue()); // e la converto in int.
}
catch (Exception e) {
System.out.println("Errore: " + e + " nella lettura da tastiera");
System.exit(0);
return(-1); // Questo return serve solo perche' il metodo
// abbia un int di ritorno anche in caso di errore
}
} // Fine di "int leggiInt()"
/* -------------------------------------------------------------------------
* Definiamo un metodo chiamato leggiFloat(), che in entrata non ha
* parametri, e in uscita restituisce un numero float immesso da tastiera.
* float leggiFloat()
* ----------------------------------------------------------------------- */
public static float leggiFloat()
{
try {
DataInputStream leggilo = new DataInputStream(System.in);
String stringa = leggilo.readLine(); // dichiaro e leggo stringa.
return(Float.valueOf(stringa).floatValue()); // e la converto in float.
}
catch (Exception e) {
System.out.println("Errore: " + e + " nella lettura da tastiera");
System.exit(0);
return(-1); // Questo return serve solo perche' il metodo
// abbia un int di ritorno anche in caso di errore
}
} // Fine di "float leggiFloat()"
} // Fine della classe Jlez7c
/* *************************************************************************
* 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 float lunghezza=0; // Variabile privata
private int numerozampe=0; // Variabile privata
animale() { // Il costruttore. Non ha parametri in entrata
lunghezza = 0;
numerozampe = 0;
System.out.println("animale inizializzato");
} // Fine costruttore
// Ora scriviamo i metodi pubblici della classe animale:
/*-------------------------------------------------------------------------*
* mettilungh: definisce la lunghezza dell'animale.
* parametri: in entrata la lunghezza in formato float.
*-------------------------------------------------------------------------*/
public void mettilungh(float i)
{
lunghezza = i; // Scrive il valore nella variabile privata "lunghezza".
}
/*-------------------------------------------------------------------------*
* 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".
}
/*-------------------------------------------------------------------------*
* leggilungh: legge e restituisce la lunghezza dell'animale.
* parametri: in uscita la lunghezza in formato float.
*-------------------------------------------------------------------------*/
public float leggilungh()
{
return lunghezza;
}
/*-------------------------------------------------------------------------*
* 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
/* *************************************************************************
* La differenza in output con il listato precedente, e' che prima della
* domanda "Lunghezza cane 1?" viene stampato:
*
* animale inizializzato
* animale inizializzato
* animale inizializzato
*
* Questo evidenzia il momento in cui sono chiamati i costruttori.
************************************************************************* */
