Laboratorio di  Programmazione.
AA 2007/08.

Esercitazione Java n. 2

Scopo di questa  sessione  è di   esercitarsi   con  caratteristiche del linguaggio Java più  lontane dal C.

  1. Creare una directory di nome Java2  e ridefinirla come directory di default  

  2.  
  3. Il seguente programma Java implementa la lettura di dati da stdin attraverso la creazione di un oggetto di classe InputStreamReader  che viene passato ad un oggetto  di classe BufferedReader  che   a sua volta dispone di un metodo readLine() che restituisce una String corrispondente ad un'intera linea di testo.  Il programma di esempio riportato qui sotto ne dimostra un impiego per leggere due stringhe che vengono poi riscritte  concatenate su stdout.  L' istruzione "throws Exception"  segnala che il metodo main può  "lanciare" un' eccezione in caso di problemi (in questo caso in lettura,  attraverso il metodo readLine()). L' eccezione corrisponde ad un oggetto (della classe Exception)  che potrebbe essere utilizzato per gestire in modo controllato il caso abnorme.  Se un metodo  è  in grado di lanciare un' eccezione,  occorre che le classi che lo utilizzano la intercettino o le propaghino con l' istruzione "throws Exception" .
  4. import java.io.*;
    public class LeggiScrivi{
    public static void main(String[] args) throws Exception {
    InputStreamReader reader = new InputStreamReader(System.in);
    BufferedReader input = new BufferedReader(reader);

    System.out.println("Nome ? ");
    String nome = input.readLine();

    System.out.println("Cognome ? ");
    String cognome = input.readLine();

    System.out.println(nome + " " + cognome);

    }
    }



  5. Programmi Java  non banali  definiscono ed utilizzano oggetti e metodi derivati  da classi diverse. Ad  esempio,  possiamo definire due classi: TestPersona e Persona. TestPersona definisce un metodo main che istanzia alcuni oggetti  dalla classe Persona. (Inserire le due classi in due file diversi (ciascuno col nome della classe  seguito dall' estensione .java.  Per compilarli è  sufficiente compilare la classe TestPersona. Il compilatore cercherà nella directory corrente il file Persona.java che dovrebbe contenere la descrizione della classe Persona.
    public class Persona{
    protected String nome = "";
    protected String cognome = "";
    public Persona(String nome, String cognome){ // metodo costruttore

    this.nome = nome; // Nel metodo, nome e cognome sono argomenti e sovrascrivono
    // le variabili di classe con lo stesso nome
    // this.nome rappresenta la variabile di classe (stato)
    //
    this.cognome = cognome;
    }
    public String toString(){ // ridefinizione del metodo toString per controllare cosa viene scritto
    return nome + " " + cognome;
    }
    public int nomeLength(){
    return nome.length();
    }

    }

    public class TestPersona{
    public static void main(String[] args){
    Persona unaPersona = new Persona("Mario","Rossi");
    Persona unAltraPersona = new Persona("Giovanni","Verdi");
    System.out.println( "una persona: " + " " + unaPersona);
    System.out.println( "una persona diversa: " + " " + unAltraPersona);
    System.out.println( "una persona diversa: nome lungo " + " " + unAltraPersona.nomeLength());

    }
    }
    Compilare ed eseguire il programma TestPersona. Verificare cosa succede se si modifica l' accesso public del metodo nomeLength di Persona da public  a private.

  6. Una classe può  ereditare da un' altra classe stato  e metodi. La classe Erede definita qui sotto eredita da Persona e  aggiunge un' ulteriore variabile di stato che rappresenta la cifra che una persona ha ereditato.
    public class Erede extends Persona
    {
    // variabile di istanza in aggiunta a quelle della classe Persona
    private int soldi;

    /**
    * Construttore della classe Erede
    */
    public Erede(String nome, String cognome, int soldi)
    {
    // utilizza prima il costruttore della classe da cui eredita
    super(nome,cognome);
    // inizializza la variabile di istanza soldi
    this.soldi = soldi;
    }

    public String toString()
    {
    // ridefinisce il metodo toString per visualizzare anche l' eredita'
    return nome + " " + cognome + " " + soldi;
    }
    public static void main(String[] args){
    Erede unErede = new Erede("Mario","Rossi",50000);
    System.out.println( "un erede: " + " " + unErede);
    }

    }
    Compilare col comando
    javac Erede.java
    ed eseguire con
    java Erede
    .

  7. Il polimorfismo descrive la possibilità di associare ad un oggetto di un tipo dati oggetti corrispondenti a classi diverse. Se assegnamio ad un oggetto di tipo Persona una nuova istanza della classe Erede, la scrittura dell' oggetto utilizzera' la ridefinizione del metodo toString apportata nella classe Erede. Provare ad inserire nel main di Erede la dichiarazione:
    Persona altroErede = new Erede("Gianni","Bianchi",5000);
    e controllare cosa succede chiedendo di scrivere altroErede.

  8. Una classe astratta non implementa tutti i metodi ma di alcuni ne lascia l' implementazione "sospesa", indicando solo il prototipo dei metodi stratti. Ovviamente non si può istanziare nessun oggetto da una classe astratta ma se ne possono derivare sottoclassi concrete definendo i metodi astratti. Un metodo astratto viene indicato mediante l' attributo abstract (es: public abstract void getDescription(); )che deve anche apparire nella definizione della classe astratta. Modificare l' esempio del punto precedente trasformando la classe Persona in classe astratta con metodo astratto nomeLength().