☕ Lezione 2

Classi e Oggetti - Il Cuore della OOP

Classi e Oggetti: I Mattoni della OOP

🎯 Obiettivi della lezione

💡 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();
    }
}
Nome: Mario Rossi Età: 17 Media voti: 7.5 Mario è promosso! Mario ha studiato! Nuova media: 8.0 --- Secondo Studente --- Nome: Giulia Bianchi Età: 16 Media voti: 8.5

🔍 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();
    }
}
=== Informazioni Auto === Marca: Ferrari Modello: F40 Anno: 1987 Velocità massima: 324.0 km/h Velocità attuale: 0.0 km/h Stato: Spenta ======================== --- Provo ad accelerare --- Accendi prima l'auto! --- Accendo l'auto --- L'auto è stata accesa. Vroom! --- Accelero --- Velocità attuale: 80.0 km/h Velocità attuale: 180.0 km/h Hai raggiunto la velocità massima! Velocità attuale: 324.0 km/h --- Freno --- Velocità attuale: 274.0 km/h --- Info finali --- === Informazioni Auto === Marca: Ferrari Modello: F40 Anno: 1987 Velocità massima: 324.0 km/h Velocità attuale: 274.0 km/h Stato: Accesa ========================

✏️ Esercizi Guidati

Esercizio 1: Classe Libro

FACILE

Obiettivo: Creare una classe Libro con attributi e metodi.

Requisiti:

  1. Crea una classe Libro con questi attributi:
    • titolo (String)
    • autore (String)
    • numeroPagine (int)
    • prezzoEuro (double)
  2. Aggiungi un metodo stampaDettagli() che stampa tutte le informazioni
  3. Aggiungi un metodo applicaSconto(double percentuale) che riduce il prezzo
  4. 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

MEDIO

Obiettivo: 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

FACILE

Crea 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

MEDIO

Crea 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

MEDIO

Crea 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

FACILE

Crea 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

  1. Qual è la differenza tra una classe e un oggetto?
  2. Come si crea un nuovo oggetto in Java?
  3. A cosa serve l'operatore punto (.)?
  4. Quanti oggetti posso creare da una classe?
  5. Gli oggetti condividono gli stessi valori degli attributi?