- Creare una directory di nome Java2 e ridefinirla come
directory di default
- 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" .
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);
}
}
- 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.
- 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
.
-
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.
-
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().