Programming lesson
Klassen und Objekte in Java: Eine praxisnahe Anleitung am Beispiel einer Rechnungsklasse für den Baumarkt
Lerne, wie du in Java eine eigene Klasse mit Instanzvariablen, Konstruktoren und Methoden erstellst. Am Beispiel einer Invoice-Klasse für einen Baumarkt zeigen wir dir Schritt für Schritt, wie Objektorientierung funktioniert – inklusive Tipps zur Formatierung mit DecimalFormat.
Einführung in die objektorientierte Programmierung mit Java
Die objektorientierte Programmierung (OOP) ist ein fundamentales Konzept in der modernen Softwareentwicklung. Besonders in Java bilden Klassen und Objekte das Rückgrat jeder Anwendung. In diesem Tutorial lernst du, wie du eine eigene Klasse erstellst, die eine Rechnung (Invoice) für einen Baumarkt abbildet. Dies ist eine typische Aufgabe aus dem Kurs CSCI 470/502, die dir hilft, die Grundlagen der OOP zu verstehen und anzuwenden.
Stell dir vor, du entwickelst ein Kassensystem für einen großen Baumarkt – ähnlich wie die Apps, die bei Hornbach oder Obi im Einsatz sind. Oder denk an ein Inventarverwaltungssystem für ein beliebtes E-Sport-Turnier, bei dem jedes Item (z. B. ein Gaming-Stuhl) eine eigene Rechnung erhält. Genau solche Szenarien lassen sich mit Klassen und Objekten elegant abbilden.
Was sind Klassen und Objekte?
Eine Klasse ist ein Bauplan für Objekte. Sie definiert, welche Eigenschaften (Instanzvariablen) und welche Fähigkeiten (Methoden) ein Objekt besitzt. Ein Objekt ist eine konkrete Instanz dieser Klasse. Wenn du also eine Klasse Invoice erstellst, kannst du davon beliebig viele Rechnungsobjekte erzeugen – jede mit eigenen Daten wie Teilenummer, Beschreibung, Menge und Preis.
In der Praxis begegnen uns Klassen ständig: In Social-Media-Apps wie Instagram ist jeder Post ein Objekt der Klasse Post. In Finanz-Apps wie Trade Republic ist jede Aktie ein Objekt der Klasse Aktie. Sogar in Schul-Notenverwaltungssystemen werden Schüler als Objekte einer Klasse Student modelliert.
Die Invoice-Klasse – Schritt für Schritt
Wir erstellen nun eine Klasse Invoice mit vier Instanzvariablen:
partNumber(String) – die Teilenummer, z. B. "AB-23-4312"partDescription(String) – die Artikelbeschreibung, z. B. "Cordless Drill"quantity(int) – die gekaufte MengepricePerItem(double) – der Preis pro Stück
Die Klasse benötigt zwei Konstruktoren: einen parameterlosen und einen, der alle vier Werte initialisiert. Außerdem braucht es Getter- und Setter-Methoden für jede Variable sowie eine Methode getInvoiceAmount(), die den Rechnungsbetrag berechnet.
Instanzvariablen und Konstruktoren
public class Invoice {
private String partNumber;
private String partDescription;
private int quantity;
private double pricePerItem;
// parameterloser Konstruktor
public Invoice() {
this.partNumber = "";
this.partDescription = "";
this.quantity = 0;
this.pricePerItem = 0.0;
}
// parametrisierter Konstruktor
public Invoice(String partNumber, String partDescription, int quantity, double pricePerItem) {
this.partNumber = partNumber;
this.partDescription = partDescription;
// Setter verwenden, um Validierung sicherzustellen
setQuantity(quantity);
setPricePerItem(pricePerItem);
}
}Beachte: Im parametrisierten Konstruktor rufen wir die Setter auf, um sicherzustellen, dass die Werte gültig sind (z. B. keine negativen Mengen).
Setter mit Validierung
public void setQuantity(int quantity) {
if (quantity > 0) {
this.quantity = quantity;
} else {
this.quantity = 0;
}
}
public void setPricePerItem(double pricePerItem) {
if (pricePerItem > 0.0) {
this.pricePerItem = pricePerItem;
} else {
this.pricePerItem = 0.0;
}
}Die Setter stellen sicher, dass negative Werte auf 0 gesetzt werden – eine typische Validierungslogik, wie sie auch in echten Warenwirtschaftssystemen vorkommt.
Getter und getInvoiceAmount()
public String getPartNumber() { return partNumber; }
public String getPartDescription() { return partDescription; }
public int getQuantity() { return quantity; }
public double getPricePerItem() { return pricePerItem; }
public double getInvoiceAmount() {
return quantity * pricePerItem;
}Die Testklasse InvoiceTest
Jetzt erstellen wir eine Testklasse, die fünf verschiedene Rechnungsobjekte anlegt und deren Daten ausgibt. Wir verwenden die DecimalFormat-Klasse, um die Beträge mit Dollarzeichen und Komma zu formatieren – so wie es auch in echten Online-Shops wie Amazon oder eBay üblich ist.
import java.text.DecimalFormat;
public class InvoiceTest {
public static void main(String[] args) {
// DecimalFormat für Währungsformat
DecimalFormat df = new DecimalFormat("$#,##0.00");
// Fünf Rechnungsobjekte erstellen
Invoice inv1 = new Invoice("AB-23-4312", "Cordless Drill", 10, 189.00);
Invoice inv2 = new Invoice("CD-45-6789", "Hammer", 25, 12.50);
Invoice inv3 = new Invoice("EF-01-2345", "Phillips Head Screwdriver", 100, 3.99);
Invoice inv4 = new Invoice("GH-67-8901", "Light Switch", 50, 4.75);
Invoice inv5 = new Invoice("IJ-23-4567", "Carpenter's Square", 15, 8.25);
// Ausgabe jeder Rechnung
printInvoice(inv1, 1, df);
printInvoice(inv2, 2, df);
printInvoice(inv3, 3, df);
printInvoice(inv4, 4, df);
printInvoice(inv5, 5, df);
}
public static void printInvoice(Invoice inv, int num, DecimalFormat df) {
System.out.println("Invoice #" + num);
System.out.println("Part No.: " + inv.getPartNumber());
System.out.println("Item Desc.: " + inv.getPartDescription());
System.out.println("Quantity: " + inv.getQuantity());
System.out.println("Item Price: " + df.format(inv.getPricePerItem()));
System.out.println("Invoice Subtotal: " + df.format(inv.getInvoiceAmount()));
System.out.println("*********************************");
}
}Die Ausgabe sieht dann zum Beispiel so aus:
Invoice #1
Part No.: AB-23-4312
Item Desc.: Cordless Drill
Quantity: 10
Item Price: $189.00
Invoice Subtotal: $1,890.00
*********************************Wichtige Konzepte und Tipps
Warum Validierung in den Settern?
Durch die Validierung in den Settern stellst du sicher, dass deine Objekte immer in einem gültigen Zustand sind. Das ist ein grundlegendes Prinzip der Datenkapselung – ein Kernkonzept der OOP. In der Praxis, etwa bei Bestellungen in einem Online-Shop, darf die Menge niemals negativ sein, sonst würde das System fehlerhaft arbeiten.
DecimalFormat richtig verwenden
Das Muster "$#,##0.00" sorgt dafür, dass Zahlen wie 1890 als $1,890.00 dargestellt werden. Der Platzhalter # bedeutet, dass die Ziffer nur angezeigt wird, wenn sie benötigt wird; die 0 erzwingt eine Stelle. So wird aus 5.0 der String $5.00. Dieses Format ist ideal für Preisanzeigen in Apps oder Finanzberichten.
Trends: Wofür braucht man das heute?
Objektorientierte Programmierung steckt in jeder modernen Anwendung: KI-Chatbots wie ChatGPT modellieren Nachrichten als Objekte, Gaming-Plattformen wie Steam verwalten Spiele als Objekte, und in Schulverwaltungssoftware werden Schüler, Lehrer und Kurse als Klassen abgebildet. Sogar Crypto-Wallets nutzen Klassen, um Transaktionen zu repräsentieren. Wenn du diese Grundlagen beherrschst, bist du bestens gerüstet für komplexere Projekte.
Häufige Fehler und wie du sie vermeidest
- Vergessen, Setter im Konstruktor aufzurufen: Wenn du die Instanzvariablen direkt zuweist, umgehst du die Validierung. Rufe immer die Setter auf.
- Falsches DecimalFormat-Muster: Achte darauf, dass das Muster zu deinem maximalen Betrag passt. Für Beträge bis $99.999.999,99 reicht
"$#,##0.00". - Keine Getter verwendet: Greife nicht direkt auf private Variablen zu, sondern nutze die öffentlichen Getter. Das ist guter Stil und erleichtert spätere Änderungen.
Zusammenfassung
In diesem Tutorial hast du gelernt, wie du in Java eine Klasse mit Instanzvariablen, Konstruktoren, Gettern und Settern erstellst. Du hast eine Invoice-Klasse implementiert, die eine Rechnung für einen Baumarkt abbildet, und eine Testklasse geschrieben, die fünf verschiedene Rechnungen ausgibt. Mit der DecimalFormat-Klasse hast du die Beträge professionell formatiert.
Diese Grundlagen sind essenziell für deine weitere Laufbahn als Programmierer – egal ob du Web-Apps, Mobile Apps oder Datenbanksysteme entwickeln möchtest. Übung macht den Meister: Versuche, die Klasse um weitere Methoden zu erweitern, z. B. eine Methode, die die Mehrwertsteuer berechnet, oder eine, die alle Rechnungen in einer Liste speichert. Viel Erfolg bei deiner Aufgabe!