Esercizio
Definire una classe con incapsulamento che rappresenta i dati di uno studente:
Definire un metodo statico che calcola come si modifica una media di interi quando viene aggiunto un nuovo intero. Sono dati: la media attuale, il numero di interi, il nuovo intero.
La classe deve essere incapsulata.
Definire i costruttori, seguendo i vincoli riportati qui sotto.
Si implementi la classe in modo tale che non sia possibile:
Definire il metodo statico che ritorna un oggetto studente i cui dati vengono letti da tastiera.
Si procede un passo per volta.
Intanto: la classe ha componenti e metodi.
Sono dati nel testo:
class Studente {
String nome;
String data;
int esami;
double media;
// metodi
}
Incapsulamento: dopo.
Intestazione del metodo:
static double nuovaMedia(double media, int numero, int nuovo) {
...
}
Facendo media*numero ottengo la somma.
Se faccio somma+nuovo/(numero+1) ottengo la nuova media.
class Studente {
String nome;
String data;
int esami;
double media;
static double nuovaMedia(double media, int numero, int nuovo) {
double somma=media*numero;
return (somma+nuovo)/(numero+1);
}
// altri metodi
}
Attenzione: si tratta di una valutazione approssimata!
L'incapsulamento si fa al contrario:
Prima di implementare, occorre vedere cosa è permesso fare.
Se non c'è scritto niente, tutte le componenti sono accessibili in lettura.
class Studente {
String nome;
String data;
int esami;
double media;
// metodo nuovaMedia
String getNome() {
return this.nome;
}
String getData() {
return this.data;
}
int getEsami() {
return this.esami;
}
double getMedia() {
return this.media;
}
}
I costruttori sono metodi che scrivono un valore nelle componenti quando gli oggetti vengono creati
Quali costruttori creare?
Di solito, ci sono tutte le possibilità:
Studente() Studente(String nome) Studente(String data) Studente(String nome, String data) Studente(int esami) ...
Nel nostro caso:
Quindi, sono ammessi:
Quindi, restano solo:
Studente(String nome, String data) Studente(String nome, String data, int esami, int media)
Solito modo:
class Studente {
String nome;
String data;
int esami;
double media;
Studente(String nome, String data) {
this.nome=nome;
this.data=data;
}
Studente(String nome, String data, int esami, double media) {
this.nome=nome;
this.data=data;
this.esami=esami;
this.media=media;
}
// altri metodi
}
Di solito, i costruttori si mettono prima degli altri metodi
Controllo che nome e data non siano null:
class Studente {
String nome;
String data;
int esami;
double media;
Studente(String nome, String data) {
if( (this.nome==null)||(this.data==null) ) {
// errore
}
this.nome=nome;
this.data=data;
}
Studente(String nome, String data, int esami, int media) {
if( (this.nome==null)||(this.data==null) ) {
// errore
}
this.nome=nome;
this.data=data;
this.esami=esami;
this.media=media;
}
// altri metodi
}
Vincoli:
Quindi:
Come al solito:
class Studente {
String nome;
String data;
int esami;
double media;
// altri metodi
void setEsamiMedia(int esami, double media) {
this.esami=esami;
this.media=media;
}
}
Studente s=new Studente("Pippo", "12/2/1938");
s=new Studente("Topolino", "1/1/1930");
Sembra che sia stato cambiato l'oggetto.
In realtà nessuno oggetto è stato modificato.
È stato creato un nuovo oggetto, il cui indirizzo è stato messo nella variabile.
Il vincolo è soddisfatto.
Leggo i dati da tastiera e restituisco un oggetto con dentro questi dati.
L'oggetto non va passato come parametro
Il metodo crea l'oggetto
Come al solito: leggo un dato per volta, e lo converto se serve.
import javax.swing.*;
class Studente {
String nome;
String data;
int esami;
double media;
// altri metodi
static Studente readKb() {
String nome=JOptionPane.showInputDialog("Scrivi il nome");
String data=JOptionPane.showInputDialog("Scrivi la data di nascita");
String s;
s=JOptionPane.showInputDialog("Scrivi il numero di esami");
int esami=Integer.parseInt(s);
s=JOptionPane.showInputDialog("Scrivi la media");
double media=Double.parseDouble(s);
return (new Studente(nome, data, esami, media));
}
}
Con BlueJ si possono direttamente creare gli oggetti, oppure invocare i metodi.
Nota: quando un metodo ritorna un oggetto, se lo si vuole salvare, evidenziare la riga result= <object referece>, e fare get
Si può comunque scrivere un programma di prova.
public class ProvaStudente
{
public static void main(String args[]) {
Studente s;
s=new Studente("Pippo", "12/3/1939");
Studente t;
t=new Studente("Topolino", "12/2/1943", 12, 19.2);
System.out.println(s.getNome());
s=Studente.readKb();
System.out.println(s.getNome());
}
}
Scrivere altre invocazioni di metodo.