OGGETTI JAVA
Cos’è un oggetto?
Ogni volta che definiamo una nuova classe stiamo costruendo un oggetto
Esempio:
Rettangolo
int base, altezza
int perimetro (int x,int y)
int area (int x, int y)
double diagonale (int x,int y)
Oggetto software
Un oggetto (non solo in java) è un sistema chiuso: ha uno stato (i valori contenuti nelle variabili) e dei metodi (le
azioni che è possibile compiere su questo oggetto).
Lo “stato” di un Rettangolo è costituito dai valori di base e altezza; le azioni che si possono compiere sono i calcoli
del perimetro, dell’area e della diagonale
Creare le proprie classi
class Rettangolo{
public Rettangolo(){
…}
public int area(){
…}
public int perimetro(){
…}
public double diagonale(){
…}
}
Costruttore: un metodo speciale
E se mi servissero più rettangoli? ciascuno con base e altezza diverse?
Per definire istanze multiple di un oggetto è necessario che sia definito un metodo COSTRUTTORE, ossia un
metodo speciale che è in grado di generare un nuovo oggetto.
N.B. Il costruttore ha sempre lo stesso nome della classe.
Istanze di un oggetto
Cosa fa il costruttore?
Ciascun oggetto si differenzia dagli altri per le sue proprietà (in questo caso base e altezza), il costruttore si occuperà
quindi di assegnare a ciascuna istanza dell’oggetto rettangolo le sue proprietà.
Per tutte le istanze saranno disponibili gli stessi metodi.
Variabili di istanza
Le variabili di istanza sono le variabili definite all’interno della classe ma esternamente ai metodi e rappresentano lo
stato dell’oggetto. Ogni oggetto creato avrà la sua copia di variabili di istanza indipendente da quella posseduta dagli
altri oggetti. Nel caso della classe Rettangolo, base e altezza sono le variabili di istanza.
class Rettangolo{
int base, altezza;
public Rettangolo(int x, int y){
base=x;
altezza=y;
}
public int area(){
return base*altezza;
}
}
1
OGGETTI JAVA
Se creiamo due oggetti:
Rettangolo primoRettangolo = new Rettangolo(20,40);
Rettangolo secondoRettangolo = new Rettangolo(30,10);
il valore delle variabili di istanza dipende dall’oggetto a cui sono associate:
per primoRettangolo base=20 e altezza=40,
per secondoRettangolo base=30 e altezza=10
private: modificatore di visibilità
Per fare in modo che le variabili di istanza base e altezza siano modificabili e/o utilizzabili solamente dal costruttore
e da tutti i metodi della classe le dichiariamo private .
class Rettangolo{
private int base, altezza;
public Rettangolo(int x, int y){
Il compito del costruttore è
assegnare, alle variabili di
istanza, le informazioni ricevute
come argomento
Usare le proprie classi
Una volta scritto e compilato correttamente il file Rettangolo.java avremo a disposizione il file Rettangolo.class.
Possiamo utilizzare la classe Rettangolo dichiarando oggetti di quel tipo in un’altra classe.
Rettangolo.java
class Rettangolo{
private int base, altezza;
public Rettangolo(int x, int y){
base=x;
altezza=y;
}
public double diagonale(){
return (Math.sqrt(Math.pow(base,2)+Math.pow(altezza,2)));
}
public int perimetro(){
return (2*(base+altezza));
}
public void mostra(){
System.out.println("Rettangolo:");
System.out.println(" - base: "+base);
System.out.println(" - altezza: "+altezza);
}
}
Geometria.java
public class Geometria {
public static void main(String args[]) {
ogni volta che chiamo il
int num1,num2;
costruttore DEVO usare
num1=35;
la parola chiave new
num2=27;
Rettangolo primoRettangolo;
primoRettangolo = new Rettangolo(num1,num2);
primoRettangolo.mostra();
System.out.println("Questo rettangolo ha area uguale a "+primoRettangolo.area());
System.out.println("Questo rettangolo ha perimetro uguale a "+primoRettangolo.perimetro());
}
}
Overloading
Si usa in una classe quando è necessario definire più metodi con lo stesso nome ma che si comportano in maniera
diversa a seconda dei parametri che gli vengono passati.
Per esempio nella classe Rettangolo potremmo fare un secondo costruttore senza parametri che genera un rettangolo
standard con base 10 e altezza 5.
Se richiamo new Rettangolo(8,19) verrà attivato in automatico il primo metodo, se richiamo new Rettangolo() si
attiverà il secondo costruttore.
2
OGGETTI JAVA
Aggiunta a Rettangolo.java
Aggiungiamo il secondo costruttore
public Rettangolo(){
base=10;
altezza=5;
}
N.B. per tutti i metodi si può fare overloading
Aggiunta a Geometria.java
Rettangolo secondoRettangolo;
secondoRettangolo=new Rettangolo();
secondoRettangolo.mostra();
System.out.println("Questo rettangolo ha area uguale a "+secondoRettangolo.area());
System.out.println("Questo rettangolo ha perimetro uguale a "+secondoRettangolo.perimetro());
Assegnazione tipi primitivi
int a,b;
a = 9;
b = 13;
a = b;
System.out.println(a);
a = 33;
System.out.println(a);
System.out.println(b);
Assegnazione oggetti: riferimento!
L’assegnazione di oggetti è molto differente da quella dei tipi primitivi. Infatti l’assegnazione di un oggetto ad un
altro della stessa classe copia il riferimento all’oggetto stesso, non il suo contenuto.
Facciamo una prova.
Altra aggiunta a Rettangolo.java
Supponiamo di scrivere un metodo della classe Rettangolo per modificare la base
public void cambiaBase(int x){
base=x;
}
Altra aggiunta a Geometria.java
System.out.print("Primo ");
primoRettangolo.mostra();
System.out.print("Secondo ");
secondoRettangolo.mostra();
System.out.println("Adesso faccio primoRettangolo=secondoRettangolo");
primoRettangolo=secondoRettangolo;
System.out.print("Primo ");
primoRettangolo.mostra();
System.out.print("Secondo ");
secondoRettangolo.mostra();
System.out.println("Adesso cambio la base del primo e la metto = a 89");
primoRettangolo.cambiaBase(89);
System.out.print("Primo ");
primoRettangolo.mostra();
System.out.print("Secondo ");
secondoRettangolo.mostra();
3
OGGETTI JAVA
new anche per le librerie
String è una classe: questo significa che esiste un costruttore che si chiama String e che posso creare un nuovo
oggetto di tipo String ???
SI
invoca il
new String(“Una bella giornata di sole”);
costruttore della
classe
Uso di oggetti istanziati
Se non assegno a una variabile ciò che ho creato con la new non posso utilizzarlo.
String s;
s = new String(“Cani e gatti”);
String maiuscolo;
maiuscolo = s.toUpperCase();
Esercizi
// questa classe implementa un modello di umano
// 1. la classe andrà poi estesa: mettere i modificatori corretti alle variabili di istanza
// 2. dare il nome corretto al costruttore
// 3. specificare i parametri che deve ricevere il costruttore analizzando il codice del costruttore stesso
// 4. completare il metodo mostra in modo che stampi le proprietà dell'umano
class Umano{
int eta;
float altezza;
boolean maschio;
public (){
eta=x;
altezza=y;
maschio=z;
}
public void mostra(){
System.out.println();
System.out.println();
System.out.println();
}
}
definite 3 variabili di tipo Umano, per ciascuna richiamate il costruttore e date le proprietà corrette per ciascuno
poi fate stampare a video le proprietà di ciascuno, Maria è già definita fate stampare a video anche lei...
public class Amici {
public static void main(String args[]) {
Umano Maria;
Maria=new Umano (21,1.60,false);
}
}
4