danilo.pianini@unibo.it
gianluca.aguzzi@unibo.it
angelo.filaseta@unibo.it
Compiled on: 2025-10-22 — versione stampabile
Due forni a microonde dello stesso modello sono due oggetti distinti, ma hanno la stessa struttura e gli stessi comportamenti.
La classe in OOP è la descrizione di un tipo di oggetto; ne definisce:
A partire da una classe, si possono creare degli oggetti.
Un programma OOP è un insieme di classi.
Il comportamento è definito a partire da un punto di ingresso (il main
),
e si sviluppa attraverso l’interazione tra gli oggetti.
Programma che scalda un piatto di pasta e lo mangia:
MicrowaveOven
, Food
MicrowaveOven
, modello "HotPoint Ariston"
, nome: oven
Food
, tipo: "Pasta al sugo"
insert(pasta)
all’oggetto oven
setTime(60)
all’oggetto oven
setPower(800)
all’oggetto oven
start()
all’oggetto oven
getContent()
all’oggetto oven
consume()
all’oggetto pasta
Il rombo indica “può contenere un oggetto del tipo indicato” (aggregazione).
Ok, ora vediamo come si realizza un programma del genere in Java!
In Java, una classe è definita con la parola chiave class
, seguita dal nome della classe (in PascalCase), e da un blocco di codice tra parentesi graffe {}
.
class MicrowaveOven {
// qui si riporta il suo contenuto
}
new
:MicrowaveOven oven = new MicrowaveOven();
null
) che indica l’assenza di un oggettonull
può essere assegnato a variabili di tipo oggetto indipendentemente dalla classeint
, boolean
, char
, …) non sono oggetti
Integer
, Boolean
, Character
, …) che li incapsulanoBigInteger
, BigDecimal
)if
, while
, for
, …) non sono oggetti
Lo stato di un oggetto sono codificati attraverso campi
var
.object
, il suo campo field
è accessibile con notazione object.field
(dot notation)[modificatori] tipo nome [= valore_iniziale];
class ClassName {
int field1;
}
0
per i tipi numericifalse
per i booleaninull
per le classiclass ClassName {
int field1 = 10; // inizializzato a 10
boolean field2; // inizializzato a false
String field3; // inizializzato a null
}
name
che ne indica il tipoclass Food {
String name; // tipo di cibo, es. "Pasta al sugo"
boolean eatean; // true se il cibo è stato mangiato
}
Il microonde deve:
Quali campi?
model
, time
, power
, on
, e content
class MicrowaveOven {
String model; // modello del microonde
int time; // tempo di cottura in secondi
int power; // potenza in watt
Food content; // cibo attualmente nel forno
boolean on; // forno attivo o meno
}
void main() {
MicrowaveOven oven = new MicrowaveOven();
oven.model = "HotPoint Ariston";
oven.time = 60;
oven.power = 800;
oven.content = new Food(); // new Food() è un'espressione!
oven.content.name = "Pasta al sugo"; // Posso accedere ai campi di content!
oven.on = true;
oven.content.eatean = true;
System.out.println(oven.model); // stampa "HotPoint Ariston"
System.out.println(oven.content.name); // stampa "Pasta al sugo"
System.out.println(oven.power); // stampa 800
System.out.println(oven.time); // stampa 60
System.out.println(oven.on); // stampa true
}
Problema: il microonde deve operare solo in certe condizioni:
Possiamo fare tutti questi controlli nel main
, ma:
La responsabilità di mantenere coerente lo stato è del forno a microonde, non del main
!
this
, sempre definita, che denota l’oggetto che contiene il metodo[modificatori] tipo_ritorno nome([tipo1 arg1, tipo2 arg2, ...]) {
// corpo
return espressione; // se tipo_ritorno != void
}
void
se non restituisce nulla){}
return
è usata per restituire un valore (se il tipo di ritorno non è void
)this.field
class ClassName {
int field1;
int method1(int arg1) {
return this.field1 + arg1;
}
}
object.method(arguments)
object
object
è chiamato il receiver del messaggio (o dell’invocazione)ClassName obj = new ClassName();
int result = obj.method1(20); // Manda il messaggio method1(20) a obj
Food
Proviamo ad aggiungere dei metodi alle nostre classi Food
e MicrowaveOven
Food
ha un metodo consume()
che “mangia” il ciboclass Food {
String name;
boolean eatean;
void consume() {
if (!eatean) {
eatean = true;
} else {
System.out.println(name + " already consumed");
}
}
}
MicrowaveOven
MicrowaveOven
?
setTime(int t)
per impostare il tempo (controllo, t > 0 e t <= 120)setPower(int p)
per impostare la potenza (controllo, p >= 150 e p <= 800)insert(Food f)
per inserire il cibo (controllo, se il forno è in uno stato valido, e f != null)start()
per accendere (controllo, cibo != null, time > 0, power > 150)off()
per spegnere (nessun controllo)getContent()
per ottenere il cibo cotto (se il forno è acceso, lo spegne e restituisce il cibo togliendolo dal microonde)MicrowaveOven
(continua)class MicrowaveOven {
String model; // modello del microonde
int time; // tempo di cottura in secondi
int power; // potenza in watt
Food content; // cibo attualmente nel forno
boolean on; // forno attivo o meno
void setPower(int power) {
if (power >= 150 && power <= 800) {
this.power = power;
} else {
System.out.println("Invalid power value, it must be between 150 and 800");
}
}
void setTime(int time) {
if (time >= 0 && time <= 120) { // 2 minuti
this.time = time;
} else {
System.out.println("Invalid time value, it must be between 0 and 120");
}
}
void insertFood(Food content) {
if (!content.eatean && !on) {
this.content = content;
} else {
System.out.println("Cannot place this food!");
}
}
Food getContent() { // apro il forno
if (on && time > 0 && power > 0) {
on = false; // spengo il microonde
Food cookedFood = content;
content = null; // rimuovo il cibo
return cookedFood;
} else {
System.out.println("Cannot get oven content!");
return null;
}
}
void start() {
if (!on && time > 0 && power > 0) {
on = true;
} else {
System.out.println("On is already set");
}
}
void off() {
if (on) {
on = false;
} else {
System.out.println("Off is already set");
}
}
}
void main() {
Food pasta = new Food();
pasta.name = "Pasta al Sugo";
MicrowaveOven oven = new MicrowaveOven();
oven.model = "Hotpoint Ariston";
// Messaggi
oven.setPower(200);
oven.setTime(60);
oven.insertFood(pasta);
// Leggi lo stato
System.out.println(oven.model);
System.out.println(oven.power);
System.out.println(oven.time);
System.out.println(oven.content.name);
oven.start();
Food cookedPasta = oven.getContent();
cookedPasta.consume();
System.out.println("Pasta consumed? " + cookedPasta.eatean);
}
Point3D
x
, y
, z
double
build(double a, double b, double c)
per inizializzare il puntogetNormSquared()
che restituisce la norma al quadrato del puntoequal(Point3D q)
che restituisce true se il punto è uguale a q
Point3D
: implementazioneclass Point3D {
double x;
double y;
double z;
void build(double a, double b, double c){
this.x = a;
this.y = b;
this.z = c;
}
double getNormSquared(){
return this.x * this.x + this.y * this.y + this.z * this.z;
}
boolean equal(Point3D q){
// true se i due punti sono uguali
return this.x == q.x && this.y == q.y && this.z == q.z;
}
}
void main() {
Point3D p = new Point3D(); // crea un nuovo punto p
p.build(10.0, 20.0, 30.0); // inizializza il punto
Point3D q = new Point3D(); // crea un nuovo punto q
q.build(10.0, 20.0, 31.0); // inizializza il punto q
double m2 = p.getNormSquared(); // ottiene la norma al quadrato
boolean samePoint = p.equal(q); // chiedo a p se è uguale a q
System.out.println(samePoint);
System.out.println(m2);
}
danilo.pianini@unibo.it
gianluca.aguzzi@unibo.it
angelo.filaseta@unibo.it
Compiled on: 2025-10-22 — versione stampabile