danilo.pianini@unibo.itgianluca.aguzzi@unibo.itangelo.filaseta@unibo.itCompiled on: 2025-12-05 — 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, FoodMicrowaveOven, modello "HotPoint Ariston", nome: ovenFood, tipo: "Pasta al sugo"insert(pasta) all’oggetto ovensetTime(60) all’oggetto ovensetPower(800) all’oggetto ovenstart() all’oggetto ovengetContent() all’oggetto ovenconsume() all’oggetto pastaIl 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 contentclass 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.fieldclass ClassName {
int field1;
int method1(int arg1) {
return this.field1 + arg1;
}
}
object.method(arguments)
objectobject è chiamato il receiver del messaggio (o dell’invocazione)ClassName obj = new ClassName();
int result = obj.method1(20); // Manda il messaggio method1(20) a obj
FoodProviamo 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");
}
}
}
MicrowaveOvenMicrowaveOven?
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);
}
Point3Dx, y, z
doublebuild(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 qPoint3D: 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.itgianluca.aguzzi@unibo.itangelo.filaseta@unibo.itCompiled on: 2025-12-05 — versione stampabile