L'articolo esplora il concetto di classe Automobile in Java attraverso esempi pratici, principi di progettazione e esercizi. L'obiettivo è fornire una comprensione chiara e completa di come modellare un'automobile come oggetto in un programma Java, evidenziando l'importanza di una progettazione orientata agli oggetti.

Introduzione al Concetto di Classe

In Java, una classe è un modello o un progetto per creare oggetti. Un oggetto è un'istanza di una classe, che contiene dati (attributi) e comportamenti (metodi). Creare una classe Automobile permette di rappresentare le caratteristiche e le azioni di un'auto nel codice.

Definizione della Classe Automobile

Una classe Automobile può essere progettata per includere attributi come:

  • consumoCarburante: Litri di carburante consumati per chilometro.
  • quantitaCarburante: Quantità di carburante presente nel serbatoio.
  • marca: Marca dell'automobile (String).
  • modello: Modello dell'automobile (String).
  • colore: Colore dell'automobile (String).
  • numeroPorte: Numero di porte dell'automobile (int).
  • isAutomatico: Indica se il cambio è automatico (boolean).

Inoltre, può includere metodi come:

  • drive(double distanza): Simula il percorso dell'automobile per una certa distanza, riducendo il carburante.
  • dammiCarburante(): Restituisce il livello attuale di carburante.
  • faiRifornimento(double litri): Aggiunge carburante al serbatoio.

Costruttori: Inizializzazione degli Oggetti

I costruttori sono metodi speciali utilizzati per inizializzare gli oggetti di una classe.

Leggi anche: Dimensioni e Specifiche Classe A W176

  • Costruttore di Default: Un costruttore senza parametri, che inizializza gli attributi con valori predefiniti.
  • Costruttore Parametrizzato: Un costruttore che accetta parametri per inizializzare gli attributi con valori specifici.
  • Costruttore di Copia: Un costruttore che crea un nuovo oggetto come copia di un oggetto esistente.
public class Automobile { private String marca; private String modello; private double consumoCarburante; private double quantitaCarburante; // Costruttore di default public Automobile() { this.marca = ""; this.modello = ""; this.consumoCarburante = 0.0; this.quantitaCarburante = 0.0; } // Costruttore parametrizzato public Automobile(String marca, String modello, double consumoCarburante) { this.marca = marca; this.modello = modello; this.consumoCarburante = consumoCarburante; this.quantitaCarburante = 0.0; // Inizialmente il serbatoio è vuoto } //Costruttore di copia public Automobile(Automobile another) { this.marca = another.marca; this.modello = another.modello; this.consumoCarburante = another.consumoCarburante; this.quantitaCarburante = another.quantitaCarburante; } // Metodi getter e setter per gli attributi public String getMarca() { return marca; } public void setMarca(String marca) { this.marca = marca; } public String getModello() { return modello; } public void setModello(String modello) { this.modello = modello; } public double getConsumoCarburante() { return consumoCarburante; } public void setConsumoCarburante(double consumoCarburante) { this.consumoCarburante = consumoCarburante; } public double getQuantitaCarburante() { return quantitaCarburante; } public void setQuantitaCarburante(double quantitaCarburante) { this.quantitaCarburante = quantitaCarburante; } // Metodo drive public void drive(double distanza) { double carburanteNecessario = distanza * consumoCarburante; if (carburanteNecessario <= quantitaCarburante) { quantitaCarburante -= carburanteNecessario; System.out.println("Percorsi " + distanza + " km. Carburante rimanente: " + quantitaCarburante + " litri."); } else { System.out.println("Carburante insufficiente per percorrere " + distanza + " km."); } } // Metodo dammiCarburante public double dammiCarburante() { return quantitaCarburante; } // Metodo faiRifornimento public void faiRifornimento(double litri) { quantitaCarburante += litri; System.out.println("Rifornimento effettuato. Nuovo livello di carburante: " + quantitaCarburante + " litri."); } @Override public String toString() { return "Automobile{" + "marca='" + marca + '\'' + ", modello='" + modello + '\'' + ", consumoCarburante=" + consumoCarburante + ", quantitaCarburante=" + quantitaCarburante + '}'; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Automobile that = (Automobile) obj; return Double.compare(that.consumoCarburante, consumoCarburante) == 0 && Double.compare(that.quantitaCarburante, quantitaCarburante) == 0 && Objects.equals(marca, that.marca) && Objects.equals(modello, that.modello); }}

Metodi Getter e Setter

I metodi getter e setter sono utilizzati per accedere e modificare gli attributi privati di una classe.

  • Getter: Restituisce il valore di un attributo.
  • Setter: Imposta il valore di un attributo.

Ereditarietà: Creazione di Sottoclassi

L'ereditarietà permette di creare nuove classi (sottoclassi) basate su classi esistenti (superclassi). Questo favorisce il riutilizzo del codice e la creazione di una gerarchia di classi. Ad esempio, si possono creare sottoclassi come AutoSportiva o SUV che ereditano gli attributi e i metodi della classe Automobile e aggiungono funzionalità specifiche.

public class AutoSportiva extends Automobile { private int velocitaMassima; public AutoSportiva(String marca, String modello, double consumoCarburante, int velocitaMassima) { super(marca, modello, consumoCarburante); this.velocitaMassima = velocitaMassima; } public int getVelocitaMassima() { return velocitaMassima; } public void setVelocitaMassima(int velocitaMassima) { this.velocitaMassima = velocitaMassima; }}

Polimorfismo

Il polimorfismo permette di trattare oggetti di classi diverse in modo uniforme. Ad esempio, si può creare un array di oggetti Automobile che contiene sia oggetti Automobile che oggetti AutoSportiva.

Classi Utilità e Responsabilità Singola

È importante che ogni classe abbia una responsabilità singola. Se una classe ha già uno scopo principale (es. modellare un'automobile), dovrebbe fare principalmente solo quello. Se si vuole leggere dati da file, si dovrebbe creare un'altra classe, ad esempio LettoreVeicoli, che si occupa della lettura dei dati e della creazione degli oggetti Automobile.

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;public class LettoreVeicoli { public static List<Automobile> leggiAutomobiliDaFile(String filePath) { List<Automobile> automobili = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { // Supponiamo che ogni linea del file contenga i dati di un'automobile separati da virgole String[] data = line.split(","); if (data.length == 3) { String marca = data[0]; String modello = data[1]; double consumoCarburante = Double.parseDouble(data[2]); Automobile automobile = new Automobile(marca, modello, consumoCarburante); automobili.add(automobile); } } } catch (IOException e) { e.printStackTrace(); } return automobili; }}

Esercizi Pratici

Di seguito sono proposti alcuni esercizi per mettere in pratica i concetti descritti:

Leggi anche: Classe A Mercedes-Maybach: Un'anteprima del lusso

  1. Classe Giocatore: Progettare una classe Giocatore con attributi come nome, capitano, goal, e goalNazionale. Implementare costruttori, getter, setter, e un metodo per calcolare il totale dei goal.
  2. Classe Smartphone: Progettare una classe Smartphone con attributi come marca, modello, prezzoDiLancio, numPollici, ram, e touchScreen. Implementare metodi per ottenere la fascia di prezzo e la tipologia di smartphone.
  3. Classe TriangoloRettangolo: Progettare una classe TriangoloRettangolo con attributi cateto1 e cateto2. Implementare metodi per calcolare l'ipotenusa, l'area, e il perimetro.
  4. Classe Libro: Progettare una classe Libro con attributi come titolo, autore, numPagine, versione, prezzoDiLancio, e prezzoAttuale. Implementare metodi per applicare sconti.
  5. Classe Cane: Realizzare una classe Cane con attributi nome, razza, e età. Implementare costruttori, getter, setter, e il metodo toString.
  6. Classe Studente: Realizzare una classe Studente con attributi nome e annoDiNascita. Implementare costruttori, getter, setter, e un metodo per confrontare l'età degli studenti.
  7. Classe Libro (Costruttore di Copia): Realizzare una classe Libro con un costruttore di copia. Creare oggetti e modificarli per osservare l'effetto del costruttore di copia.
  8. Classe Computer (Costruttore di Copia): Realizzare una classe Computer con un costruttore di copia. Creare oggetti e modificarli per osservare l'effetto del costruttore di copia.
  9. Classe Mouse (Metodo Equals): Realizzare una classe Mouse e implementare il metodo equals per confrontare oggetti.
  10. Classe Automobile (Metodo Equals): Implementare il metodo equals nella classe Automobile per confrontare oggetti.
  11. Classe Strumento Musicale (Inserimento Dati da Tastiera): Realizzare una classe Strumento con un metodo per inserire dati da tastiera.
  12. Classe Puzzle (Inserimento Dati da Tastiera): Realizzare una classe Puzzle con un metodo per inserire dati da tastiera.
  13. Classe PuntoCartesiano: Implementare una classe PuntoCartesiano.

Esempio Completo: Classe Automobile con Metodo Equals

import java.util.Objects;public class Automobile { private String marca; private String modello; private int annoProduzione; public Automobile() { } public Automobile(String marca, String modello, int annoProduzione) { this.marca = marca; this.modello = modello; this.annoProduzione = annoProduzione; } public String getMarca() { return marca; } public void setMarca(String marca) { this.marca = marca; } public String getModello() { return modello; } public void setModello(String modello) { this.modello = modello; } public int getAnnoProduzione() { return annoProduzione; } public void setAnnoProduzione(int annoProduzione) { this.annoProduzione = annoProduzione; } @Override public String toString() { return "Automobile{" + "marca='" + marca + '\'' + ", modello='" + modello + '\'' + ", annoProduzione=" + annoProduzione + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Automobile that = (Automobile) o; return annoProduzione == that.annoProduzione && Objects.equals(marca, that.marca) && Objects.equals(modello, that.modello); }}
import java.util.Scanner;public class MainAutomobile { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Creazione della prima automobile System.out.println("Inserisci i dati della prima automobile:"); System.out.print("Marca: "); String marca1 = scanner.nextLine(); System.out.print("Modello: "); String modello1 = scanner.nextLine(); System.out.print("Anno di produzione: "); int anno1 = scanner.nextInt(); scanner.nextLine(); // Consuma il newline Automobile auto1 = new Automobile(marca1, modello1, anno1); // Creazione della seconda automobile System.out.println("\nInserisci i dati della seconda automobile:"); System.out.print("Marca: "); String marca2 = scanner.nextLine(); System.out.print("Modello: "); String modello2 = scanner.nextLine(); System.out.print("Anno di produzione: "); int anno2 = scanner.nextInt(); scanner.nextLine(); // Consuma il newline Automobile auto2 = new Automobile(marca2, modello2, anno2); // Confronto delle automobili if (auto1.equals(auto2)) { System.out.println("\nLe due automobili sono uguali."); } else { System.out.println("\nLe due automobili sono diverse."); } scanner.close(); }}

Leggi anche: Risolvere i Problemi all'Alternatore Mercedes W203

tags: #classe #automobile #java #esempio

Popolare: