Classi e Oggetti: I Mattoni della OOP
🎯 Obiettivi della lezione
- Comprendere cosa sono classi e oggetti
- Capire la differenza tra classe e oggetto
- Creare la prima classe personalizzata
- Istanziare oggetti e usarli
- Definire attributi e metodi
💡 Cos'è una Classe?
Una classe è un modello (o "template") che definisce le caratteristiche e i comportamenti di un tipo di oggetto.
Pensa alla classe come al progetto di una casa: descrive come deve essere fatta, ma non è la casa vera e propria.
💡 Cos'è un Oggetto?
Un oggetto è un'istanza di una classe, cioè una realizzazione concreta del modello definito dalla classe.
Se la classe è il progetto della casa, l'oggetto è la casa costruita seguendo quel progetto. Puoi costruire tante case diverse usando lo stesso progetto!
🔄 Confronto con il C
In C usavi le struct per raggruppare dati:
struct Persona {
char nome[50];
int eta;
};
struct Persona p1;
strcpy(p1.nome, "Mario");
p1.eta = 18;
In Java usi le class che possono contenere sia dati (attributi) che funzioni (metodi):
class Persona {
String nome;
int eta;
void saluta() {
System.out.println("Ciao, sono " + nome);
}
}
Persona p1 = new Persona();
p1.nome = "Mario";
p1.eta = 18;
p1.saluta(); // "Ciao, sono Mario"
🏗️ Anatomia di una Classe
Una classe è composta da:
1. Attributi (o Campi o Proprietà)
Sono le variabili che rappresentano le caratteristiche dell'oggetto.
Esempio: una classe Auto può avere attributi come marca, modello, velocita
2. Metodi (o Funzioni)
Sono le funzioni che definiscono il comportamento dell'oggetto.
Esempio: la classe Auto può avere metodi come accelera(), frena(), visualizzaInfo()
📝 Esempio Pratico: Classe Studente
Creiamo la nostra prima classe completa:
public class Studente {
// ATTRIBUTI - caratteristiche dello studente
String nome;
String cognome;
int eta;
double mediaVoti;
// METODI - azioni che lo studente può fare
// Metodo per stampare le informazioni
void stampaInfo() {
System.out.println("Nome: " + nome + " " + cognome);
System.out.println("Età: " + eta);
System.out.println("Media voti: " + mediaVoti);
}
// Metodo per verificare se è promosso
boolean ePromosso() {
return mediaVoti >= 6.0;
}
// Metodo per studiare (aumenta la media)
void studia(double miglioramento) {
mediaVoti = mediaVoti + miglioramento;
if (mediaVoti > 10) {
mediaVoti = 10; // La media non può superare 10
}
System.out.println(nome + " ha studiato! Nuova media: " + mediaVoti);
}
}
🎨 Usare la Classe: Creare Oggetti
Ora creiamo e usiamo oggetti della classe Studente:
public class TestStudente {
public static void main(String[] args) {
// Creare un oggetto (istanziare la classe)
Studente studente1 = new Studente();
// Impostare gli attributi
studente1.nome = "Mario";
studente1.cognome = "Rossi";
studente1.eta = 17;
studente1.mediaVoti = 7.5;
// Chiamare i metodi
studente1.stampaInfo();
// Verificare se è promosso
if (studente1.ePromosso()) {
System.out.println(studente1.nome + " è promosso!");
}
// Far studiare lo studente
studente1.studia(0.5);
System.out.println("\n--- Secondo Studente ---\n");
// Creare un secondo oggetto dalla stessa classe
Studente studente2 = new Studente();
studente2.nome = "Giulia";
studente2.cognome = "Bianchi";
studente2.eta = 16;
studente2.mediaVoti = 8.5;
studente2.stampaInfo();
}
}
🔍 Analisi del Codice
Creazione dell'oggetto:
Studente studente1 = new Studente();
- Studente → tipo della variabile (la classe)
- studente1 → nome della variabile (riferimento all'oggetto)
- new → operatore per creare un nuovo oggetto in memoria
- Studente() → chiamata al costruttore (lo vedremo nella prossima lezione)
Accesso agli attributi:
studente1.nome = "Mario";
Usiamo l'operatore punto (.) per accedere agli attributi e ai metodi dell'oggetto.
Chiamata ai metodi:
studente1.stampaInfo();
Anche per chiamare i metodi usiamo l'operatore punto.
🚗 Esempio Completo: Classe Auto
Vediamo un altro esempio pratico:
public class Auto {
// Attributi
String marca;
String modello;
int anno;
double velocitaAttuale;
double velocitaMassima;
boolean accesa;
// Metodo per accendere l'auto
void accendi() {
if (!accesa) {
accesa = true;
velocitaAttuale = 0;
System.out.println("L'auto è stata accesa. Vroom!");
} else {
System.out.println("L'auto è già accesa!");
}
}
// Metodo per spegnere l'auto
void spegni() {
if (accesa && velocitaAttuale == 0) {
accesa = false;
System.out.println("Auto spenta.");
} else if (velocitaAttuale > 0) {
System.out.println("Ferma l'auto prima di spegnerla!");
} else {
System.out.println("L'auto è già spenta!");
}
}
// Metodo per accelerare
void accelera(double incremento) {
if (!accesa) {
System.out.println("Accendi prima l'auto!");
return;
}
velocitaAttuale += incremento;
if (velocitaAttuale > velocitaMassima) {
velocitaAttuale = velocitaMassima;
System.out.println("Hai raggiunto la velocità massima!");
}
System.out.println("Velocità attuale: " + velocitaAttuale + " km/h");
}
// Metodo per frenare
void frena(double decremento) {
velocitaAttuale -= decremento;
if (velocitaAttuale < 0) {
velocitaAttuale = 0;
}
System.out.println("Velocità attuale: " + velocitaAttuale + " km/h");
}
// Metodo per visualizzare le informazioni
void mostraInfo() {
System.out.println("=== Informazioni Auto ===");
System.out.println("Marca: " + marca);
System.out.println("Modello: " + modello);
System.out.println("Anno: " + anno);
System.out.println("Velocità massima: " + velocitaMassima + " km/h");
System.out.println("Velocità attuale: " + velocitaAttuale + " km/h");
System.out.println("Stato: " + (accesa ? "Accesa" : "Spenta"));
System.out.println("========================");
}
}
🧪 Test della Classe Auto
public class TestAuto {
public static void main(String[] args) {
// Creare un'auto
Auto miaAuto = new Auto();
// Impostare gli attributi
miaAuto.marca = "Ferrari";
miaAuto.modello = "F40";
miaAuto.anno = 1987;
miaAuto.velocitaMassima = 324;
miaAuto.velocitaAttuale = 0;
miaAuto.accesa = false;
// Mostrare le info
miaAuto.mostraInfo();
System.out.println("\n--- Provo ad accelerare ---");
miaAuto.accelera(50); // Non funzionerà, auto spenta!
System.out.println("\n--- Accendo l'auto ---");
miaAuto.accendi();
System.out.println("\n--- Accelero ---");
miaAuto.accelera(80);
miaAuto.accelera(100);
miaAuto.accelera(150); // Raggiungo la velocità max
System.out.println("\n--- Freno ---");
miaAuto.frena(50);
System.out.println("\n--- Info finali ---");
miaAuto.mostraInfo();
}
}
✏️ Esercizi Guidati
Esercizio 1: Classe Libro
FACILEObiettivo: Creare una classe Libro con attributi e metodi.
Requisiti:
- Crea una classe Libro con questi attributi:
- titolo (String)
- autore (String)
- numeroPagine (int)
- prezzoEuro (double)
- Aggiungi un metodo stampaDettagli() che stampa tutte le informazioni
- Aggiungi un metodo applicaSconto(double percentuale) che riduce il prezzo
- Nel main, crea 2 libri diversi e prova i metodi
Schema di partenza:
public class Libro {
// Attributi
String titolo;
String autore;
int numeroPagine;
double prezzoEuro;
// Metodo per stampare i dettagli
void stampaDettagli() {
// Completa tu
}
// Metodo per applicare uno sconto
void applicaSconto(double percentuale) {
// Completa tu
// Suggerimento: prezzoEuro = prezzoEuro - (prezzoEuro * percentuale / 100)
}
}
Esercizio 2: Classe ContoBancario
MEDIOObiettivo: Creare una classe per gestire un conto bancario.
Requisiti:
- Attributi: intestatario, numeroConto, saldo
- Metodo deposita(double importo) - aggiunge soldi al saldo
- Metodo preleva(double importo) - toglie soldi se ci sono fondi sufficienti
- Metodo visualizzaSaldo() - mostra il saldo attuale
- Metodo bonifico(ContoBancario destinatario, double importo) - trasferisce soldi
Suggerimenti:
- Nel metodo preleva, controlla che il saldo sia sufficiente prima di prelevare
- Nel metodo bonifico, usa preleva sul conto corrente e deposita sul destinatario
💪 Esercizi da Svolgere
Esercizio 3: Classe Rettangolo
FACILECrea una classe Rettangolo con:
- Attributi: base, altezza
- Metodo calcolaArea() che restituisce l'area
- Metodo calcolaPerimetro() che restituisce il perimetro
- Metodo eQuadrato() che restituisce true se base == altezza
Esercizio 4: Classe Prodotto
MEDIOCrea una classe Prodotto per un negozio:
- Attributi: nome, codice, prezzo, quantitaDisponibile
- Metodo per vendere (riduce la quantità)
- Metodo per rifornire (aumenta la quantità)
- Metodo per verificare disponibilità
- Metodo per calcolare il valore totale in magazzino
Esercizio 5: Classe Temperatura
MEDIOCrea una classe Temperatura:
- Attributo: celsius (double)
- Metodo toFahrenheit() - restituisce la temperatura in Fahrenheit
- Metodo toKelvin() - restituisce la temperatura in Kelvin
- Metodo eSottoZero() - restituisce true se < 0°C
- Metodo aumenta(double gradi) - aumenta la temperatura
Formule: F = C * 9/5 + 32, K = C + 273.15
Esercizio 6: Classe Cerchio
FACILECrea una classe Cerchio con:
- Attributo: raggio
- Metodo calcolaArea() (formula: π * r²)
- Metodo calcolaCirconferenza() (formula: 2 * π * r)
- Usa Math.PI per il valore di π
🎯 Concetti Chiave da Ricordare
- Una classe è un modello, un oggetto è un'istanza concreta di quel modello
- Gli attributi rappresentano le caratteristiche (dati)
- I metodi rappresentano i comportamenti (azioni)
- Si usa new per creare un nuovo oggetto
- L'operatore punto (.) serve per accedere ad attributi e metodi
- Dalla stessa classe possiamo creare tanti oggetti diversi
- Ogni oggetto ha i suoi propri valori per gli attributi
🔍 Domande di Autovalutazione
- Qual è la differenza tra una classe e un oggetto?
- Come si crea un nuovo oggetto in Java?
- A cosa serve l'operatore punto (.)?
- Quanti oggetti posso creare da una classe?
- Gli oggetti condividono gli stessi valori degli attributi?