Lesehilfe Java-Programme für OO2025 (Entwurf, V. 2025/1/18)
| |
|
|
Copyright 2025 Prof. Dr. Josef L. Staud |
|
|
|
Autor: Josef L. Staud |
|
|
|
Umfang des gedruckten Textes: 89 Seiten |
|
Dieser Text gibt Erläuterungen zu den Java-Beispielen in [Staud 2025]. Er stellt keine Einführung in Java dar, vgl. dazu die Bücher im Literaturverzeichnis, soll aber eine Beziehung zwischen den UML-Konstrukten und einer objektorientierten Programmiersprache herstellen. |
|
Diese HTML-Seiten wurden mit Hilfe eines von mir erstellten Programms erzeugt: WebGenerator2 (Version 2023). Es setzt Texte in HTML-Seiten um und wird ständig weiterentwickelt. Die "maschinelle" Erstellung erlaubt es, nach jeder Änderung des Textes diesen unmittelbar neu in HTML-Seiten umzusetzen. Da es nicht möglich ist, nach jeder Neuerstellung alle Seiten zu prüfen, ist es durchaus möglich, dass irgendwo auf einer "abgelegenen" Seite Fehler auftreten. Ich bitte dafür um Verzeihung und um Hinweise (hs@staud.info). |
|
Die Veröffentlichung im Web erfolgt ab 2022 in zwei Versionen: Mit und ohne Frame-Technologien. Zu meinem Bedauern wird die Frame-Technologie inzwischen von den Verantwortlichen als unerwünscht angesehen und es häufen sich die Hinweise, dass bestimmte Browser Frame-basierte Seiten nicht mehr korrekt interpretieren können. Deshalb habe ich eine zweite Version meines Programms WebGenerator erstellt, die ohne Frames realisiert ist. |
|
Urheberrecht |
|
Dieser Text ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Textes oder von Teilen dieses Textes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechtsgesetzes. |
|
Warenzeichen und Markenschutz |
|
Alle in diesem Text genannten Gebrauchsnamen, Handelsnamen, Marken, Produktnamen, usw. unterliegen warenzeichen-, marken- oder patentrechtlichem Schutz bzw. sind Warenzeichen oder eingetragene Warenzeichen der jeweiligen Inhaber. Die Wiedergabe solcher Namen und Bezeichnungen in diesem Text berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Gesetzgebung zu Warenzeichen und Markenschutz als frei zu betrachten wären und daher von jedermann benutzt werden dürften. |
|
|
|

|
|
|
|
Prof. Dr. Josef Ludwig Staud |
|
|
|
Vorwort, Inhalt, Abkürzungen
| |
Vorwort |
|
Der Gegensatz von Struktur und Verhalten ist in der IT (bei den Digitalisierungsbemühungen) allgegenwärtig. Denken wir nur Programme und Datenbanken. Oder an Geschäftsprozesse vs. Datenbanken. Für Struktur in diesem Sinne wurden vor Jahrzehnten ausgefeilte Datenbanktechniken entwickelt, die derzeit mit NoSQL-Datenbanken eine an die Anforderungen des Internetzeitalters angepasste Form gefunden haben. Für Verhalten in diesem Sinne wurden die Programmiersprachen entwickelt, die schon immer erlaubten, Verarbeitungsvorgänge zu erfassen (dafür wurden sie geschaffen), und die es heute erlauben, die Dynamik ganzer Geschäftsprozesse in Programmen darzustellen. |
Struktur und Verhalten |
In der UML 2.5 sind die Strukturaspekte betont, vgl. [Staud 2025]. Hier soll nun gezeigt werden, wie diese in Java umgesetzt werden können. |
|
|
|
Inhaltsverzeichnis der Druckversion |
|
Vorwort, Inhalt, Abkürzungen. 2 |
|
1 Einleitung.. 6 |
|
1.1 Konzept 6 |
|
1.2 Bibliotheken. 6 |
|
1.3 Packages. 7 |
|
2 Grundlagen. 8 |
|
2.1 Datentypen. 8 |
|
2.2 Attribute. 8 |
|
2.3 Logische Operatoren. 9 |
|
3 Konsolenarbeit. 10 |
|
3.1 Ausgeben auf Konsole. 10 |
|
3.2 Lesen von der Konsole. 10 |
|
4 Klassen, Objekte, Methoden. 13 |
|
4.1 Klassen einrichten. 13 |
|
4.1.1 Grundlagen. 13 |
|
4.1.2 Sichtbarkeit 14 |
|
4.2 Objekte einrichten - Konstruktoren. 14 |
|
4.3 Record-Klassen. 16 |
|
4.4 Aufruf von Methoden und Attributen. 16 |
|
5 Prozedurales. 18 |
|
5.1 Schleifen und Verzweigungen. 18 |
|
5.2 Das Try/Catch-Konstrukt 19 |
|
6 Textdateien bearbeiten. 21 |
|
6.1 Paket java.io. 21 |
|
6.2 Zugriffe mit Streams. 21 |
|
6.3 Klasse File. 22 |
|
7 Exceptions. 25 |
|
8 Projekt HS1. 26 |
|
8.1 Klasse HP. 26 |
|
8.2 Klasse Stud. 29 |
|
8.3 Programmlauf. 31 |
|
9 Projekt HS2. 33 |
|
9.1 Klasse HP. 33 |
|
9.2 Klasse Stud. 37 |
|
9.3 Beispielhafter Programmlauf. 38 |
|
10 Projekt HS3. 40 |
|
10.1 Klasse HP. 40 |
|
10.2 Klasse Stud. 44 |
|
10.3 Programmlauf. 45 |
|
11 Projekt HS4. 47 |
|
11.1 Klasse HP. 47 |
|
11.2 Klasse Noten. 48 |
|
11.3 Klasse Stud. 49 |
|
11.4 Programmlauf. 51 |
|
12 Projekt HS5. 52 |
|
12.1 Klasse HP. 52 |
|
12.2 Klasse Stud. 54 |
|
12.3 Beispielhafter Programmlauf. 55 |
|
13 Projekt HS6. 57 |
|
13.1 Klasse HP. 57 |
|
13.2 Klasse Stud. 59 |
|
13.3 Programmlauf. 59 |
|
14 Projekt HS7 - Vererbung, Attribute. 61 |
|
14.1 Klasse Fahrzeuge. 61 |
|
14.2 Klasse PKW... 63 |
|
14.3 Klasse LKW... 63 |
|
14.4 Klasse Van. 64 |
|
14.5 Klasse HP. 66 |
|
14.6 Programmlauf. 72 |
|
15 Projekt HS8 – Kapselung.. 75 |
|
15.1 Klasse HP. 75 |
|
15.2 Klasse Stud. 76 |
|
15.3 Programmlauf. 77 |
|
16 Arbeit mit Dateien. 78 |
|
17 Projekt hsdaten. 79 |
|
17.1 Klasse Erstellen. 79 |
|
17.2 Klasse Schreiben. 80 |
|
17.3 Klasse Schreiben2. 81 |
|
17.4 Klasse Lesen. 83 |
|
17.5 Klasse Anhaengen. 84 |
|
17.6 Klasse Loeschen. 87 |
|
17.7 Klasse ErzeugLoesch. 88 |
|
17.8 Klasse EinlesenCSV.. 91 |
|
18 Literatur. 95 |
|
|
|
Abkürzungsverzeichnis |
|
Abkürzung |
|
API |
Application Programming Interface |
HS |
Hochschule |
IT |
Informationstechnologie/n |
JDBC |
Java Database Connectivity |
JDK |
Java Development Kit. OpenJDK |
JRE |
Java Runtime Environment |
KI |
Künstliche Intelligenz |
OCL |
Object Constraint Language |
OID |
Objektidentifizierer |
RDBS |
Relationale Datenbanksysteme |
UML |
Unified Modeling Language |
VM |
Virtual Machine. Laufzeitumgebung. Java-Interpreter |
| |
|
|
|
|
|
|
1 Einleitung |
|
|
|
1.1 Konzept |
|
Wie oben schon ausgeführt, ist dieser Text ein Begleittext zu [Staud 2025], den man auf dieser Web-Seite in der Zeile darüber ansteuern kann und der wichtige Teile der UML 2.5 beschreibt. Dort sind einige Java-Programme eingefügt, die aufzuzeigen, wie wichtige Elemente der objektorientierten Theorie in einer objektorientierten Programmiersprache umgesetzt sind. Es geht also um die Umsetzung ausgewählter Konstrukte und Konzepte der objektorientierten Theorie in einer objektorientierten Sprache (dafür wurde Java gewählt) und somit um die Frage: |
Begleittext zu [Staud 2025] (oben) |
Wie sind die objektorientierten Konzepte und Konstrukte der UML 2.5 in Java umgesetzt? |
|
In diesem Begleittext werden genau die Elemente von Java erläutert, die für das Verständnis obiger Programme notwendig sind. So sollte z.B. jemand, der objektorientierte oder prozedurale Programmiererfahrung hat, die Java-Programme in [Staud 2025] nachvollziehen können. |
|
Nicht verwirren lassen: In objektorientierten Programmen (im Gegensatz zu objektorientierten Datenbanken) wird unter Objekten auch die Zusammenstellung von Programmfragmenten für spezifische Aufgaben verstanden. Hier z.B. bei der Klasse File und vielen weiteren (z.B. den sog. Stromklassen, vgl. unten). Es sollten also inhaltlich bedeutsame Objektklassen (Angestellte, ihre Attribute und die mit ihnen zusammenhängenden Methoden) und programmtechnisch notwendige Klassen unterschieden werden. In Java ist dies besonders ausgeprägt. Die gesamte Anwendung besteht aus Klassen, d.h. es müssen auch Vorgänge wie Dateien einrichten/Löschen, in Dateien schreib en, aus Dateien lesen in das Klassen- und Objektkonzept abgebildet werden. Vgl. die Beispiele unten, zu letzterem v.a. die in hsdaten. |
Inhaltlich vs. programm-technisch |
Dies gilt auch für das Hauptprogramm (main), das aus objektorientierter Sicht eine statische Funktion ist. Auch dieses wird, vgl. die Beispiele unten, in eine eigene Klasse gepackt. |
Main |
Keine Einführung in Java |
|
Dieser Text ist keine Einführung in Java. Dafür gibt es umfassende Literatur, siehe z.B. die Literaturliste. Eine umfassende Darstellung, auch mit kleinen Beispielen, findet sich in der API-Dokumentation von Oracle: |
|
https://docs.oracle. com/en/java/java se/21/docs/api/java.base/java/util/regex/Pattern.html |
|
Sollte die Suchmaschine mit der langen Adresse nicht klarkommen, einfach mit |
|
https://docs.oracle.com/en/ |
|
beginnen und im Oracle-Menü weitergehen. |
|
1.2 Bibliotheken |
|
Wie in den Beispielen zu sehen ist, sind in Java viele der benötigten Programmleistungen in Bibliotheken ausgelagert, die bei Bedarf importiert werden können. Zum Beispiel so: |
|
import javax.swing.JOptionPane;
|
|
Die wichtigste ist die Java-Standardbibliothek. Ihre einzelnen Pakete (vgl. unten) sind hierarchisch in einer Baumstruktur angeordnet. Die Wurzel ist java, bzw. javax. Danach folgen z.B.: |
|
- java.awt (Abstract Windowing Toolkit). Klassen zur Arbeit mit grafischen Oberflächen.
- java.math. Paket für mathematische Methoden.
- java.util. "Bietet Typen für Datenstrukturen, Raum und Zeit sowie für Teile der Internationalisierung sowie für Zufallszahlen." [Ullenboom 2024, S. 1579]. In den Beispielen hier wird die Klasse java.util.Scanner sehr oft benötigt.
- java.sql und javax.sql. Zur Arbeit mit relationalen Datenbanksystemen.
- java.io und java.nio. "Möglichkeiten zur Ein- und Ausgabe. Dateien werden als Objekte repräsentiert. Datenströme erlauben den sequentiellen Zugriff auf Dateiinhalte." [Ullenboom 2024, S. 1578].
- java.lang. Dieses Paket ist automatisch eingebunden. Enthält u.a. die String-Klasse, die oft benötigt wird.
- javax.swing. Stellt Komponenten für grafische Oberflächen zur Verfügung. Hier wird javax.swing.JoptionPane oft genutzt.
|
|
1.3 Packages |
|
Für die Programmerstellung und -ausführung werden neben dem Java-Compiler eine Vielzahl von Programmbibliotheken benötigt. Diese sind in Paketen organisiert. Pakete bestehen aus inhaltlich zusammenhängenden Klassen für bestimmte Aufgaben, z.B. Bildschirmeingabe, Dateibearbeitung, mathematische Aufgaben. Diese Pakete und/oder Klassen werden mittels Import-Befehlen zum jeweiligen Programm dazugeladen. Vgl. die Programme unten. |
|
Auch die Quellcodedateien eines Projekts werden in Packages zusammengefasst. Entweder durch einen Befehl in der ersten Zeile des Quellprogramms oder, falls dies unterbleibt, in einem default package. Vgl. die Programme unten. |
|
2 Grundlagen |
|
In den Beispielen wird meist der Anwendungsbereich Hochschule gewählt. Abgekürzt mit HS. Klassen sind dann z.B. Studierende (Stud), Attribute sind matrikelNr, name, vName, usw. Siehe die Programmbeispiele unten. |
|
|
|
2.1 Datentypen |
|
Die Datentypen in Java können wie folgt unterschieden werden: |
|
- Elementare Typen: Die elementaren (primitiven) Typen sind in Java eingebaute Datentypen für Zahlen, Unicode-Zeichen und Wahrheitswerte.
- Referenztypen: Mit diesen lassen sich Objektverweise etwa auf Zeichenketten, Datenstrukturen, usw. realisieren.
|
|
Die hier verwendeten elementaren Datentypen von Java sind die Folgenden: |
|
Ganzzahlen |
|
- Byte (Länge 8 Bit)
- Short (16 Bit)
- Int (32 Bit)
- Long ( 64 Bit)
|
|
Fließkommazahlen |
|
- Float (32 Bit)
- Double (64 Bit)
|
|
Sonstige Datentypen |
|
- Boolean (1 Bit)
- Char (16 Bit)
|
|
Nicht-elementare Datentypen |
|
Strings |
|
Sie spielen eine wichtige Rolle, sind aber keine elementaren Datentypen, sondern Verweise auf Objekte. |
|
Arrays |
|
Ein Array (auf deutsch Feld) ist ein Datentyp, der mehrere gleich definierte Werte (Attributsausprägungen, Objekte, …) zu einer Einheit zusammenfasst. Z.B. mit elementaren Datentypen, aber auch mit komplexeren. In Projekt HS3 wird ein Array genutzt, um zufällig generierte Objekte zu verwalten. Soll das Array mehrdimensional sein, wird an jeder Position des Array ein weiteres Array gespeichert. |
|
2.2 Attribute |
|
Instanzenattribute |
|
In der objektorientierten Theorie sind Attribute meist mit Objekten (Instanzen) verknüpft. Da bedeutet z.B. |
|
s100.name
|
|
s100.vName
|
|
s100.anzSem
|
|
s100.gebTag
|
|
dass es eine Klasse Stud (Studierende) gibt mit einer Studierenden (einem Objekt, einer Instanz) s100 und den Attributen name, vName, anzSem (Anzahl Semester) sowie gebTag (Geburtstag) gibt. Der jeweilige Datentyp wird in der Klassendefinition festgelegt. Vgl. Projekt HS5. |
|
Natürlich kann solch ein Instanzenattribut auch im Programm beschrieben werden. Die Variable ii soll hier die Semesteranzahl darstellen. |
|
S100.anzSem = ii;
|
|
Die Bedeutung ist wie folgt: das Attribut anzSem (Anzahl Semester) von Objekt s100 erhält den Wert ii. |
|
Klassenattribute |
|
Wie in der UML vorgesehen, kennt Java auch Klassenattribute. Deren Attributsausprägungen beziehen sich auf die jeweilige Klasse als Ganze. In den Beispielen unten wird das Klassenattribut anzSem sehr oft eingesetzt. |
|
static int anzStud = 0;
|
|
Deklaration eines Klassenattributs mit Anfangswert. |
|
Variablen |
|
Der Umgang mit Variablen entspricht weitgehend dem der prozeduralen Programmiersprachen. Die folgenden Situationen kommen in den Beispielprogrammen vor. |
|
Einrichtung im Programm |
|
Z.B.: |
|
int i = 0; //Integer-Variable
|
|
short ii = (short) i; //Umwandlung integer in short integer
|
|
boolean fertig = false; //boolesche Variable
|
|
2.3 Logische Operatoren |
|
In den Beispielen werden vereinzelt auch die logischen Operatoren benötigt. Ihre Notation weicht nicht von der üblichen ab: |
|
- Nicht (!)
- Und (zwei kaufmännische Und)
- Oder (||)
- XOR (^)
|
|
3 Konsolenarbeit |
|
|
|
3.1 Ausgeben auf Konsole |
|
Die Ausgabe von Daten auf der Konsole erfolgt mit dem Befehl System.out.print in seinen Varianten, z.B.: |
|
System.out.print("Matrikelnummer: "); //ohne Zeilenvorschub
|
|
System.out.println(); //mit Zeilenvorschub
|
|
System.out.printf("MNr: " + mNr);
|
|
Printf bedeutet: als erstes wird ein String verlangt, dann können beliebig viele weitere Übergabewerte folgen. Vgl. [Ullenboom 2024, S. 471]. |
|
Die Ausgabe von Objektdaten auf der Konsole erfolgt entsprechend: |
|
System.out.println(stud.matrikelNr);
|
|
System.out.println(stud.vName + " " + stud.name);
|
|
System.out.println(stud.plz + " " + stud.ort);
|
|
System.out.println(stud.strasse + " " + stud.hausnummer);
|
|
Oben: Das Objekt stud mit einigen seiner Attribute. Vgl. zur Klasse Stud die Programme unten, z.B. HS1. |
|
3.2 Lesen von der Konsole |
|
Mit java.util.scanner |
|
Für das Lesen von der Konsole (z.B. Benutzerangaben) gibt es unterschiedliche Varianten. Die einfachste ist die mit der Klasse java.util.Scanner. Eine einfache zeilenweise Konsoleneingabe mit Einlesen der Eingabe in eine Variable kann mit ... |
|
java.util.Scanner(System.in)
|
|
realisiert werden. Der Quellcode sieht dann z.B. so aus (vgl. HS5): |
|
...
|
|
System.out.println("Objekt eingeben (j/n): ");
|
|
String s = new java.util.Scanner(System.in).nextLine();
|
|
|
|
switch(s) {
|
|
case "j":
|
|
System.out.println("Eingabe:");
|
|
System.out.print("Matrikelnummer: ");
|
|
int mNr = new java.util.Scanner(System.in).nextInt();
|
|
...
|
|
Auf dem Bildschirm ergibt sich das mit Windows 11 wie folgt: |
|

|
|
Weitere Beispiele |
|
String e1 = new java.util.Scanner(System.in).nextLine();//String einlesen
|
|
int int i = new java.util.Scanner(System.in).nextInt();
|
|
double dd = new java.util.Scanner(System.in).nextDouble();//Datentyp double einlesen
|
|
Zu beachten ist die zum Datentyp passende Methodenbezeichnung. |
|
Mit dem Swing-Paket |
|
Das Swing-Paket erlaubt grafisch gestaltete Eingabefenster. Im Quellcode muss folgendes eingegeben werden: |
|
import javax.swing.JOptionPane;
|
|
... |
|
String eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Ihre Wahl");
|
|
Dann sieht das Eingabefenster so aus: |
|

|
|
Varianten: |
|
eingabe = JOptionPane.showInputDialog("Welcher Student (0 / 1)?");
|
|
int nr = Integer.parseInt(eingabe);
|
|
Dabei liefert parseInt die Umwandlung der Stringvariablen in eine Integervariable. |
|
Anmerkung |
|
Diese Option steht nur zur Verfügung, falls in Eclipse das module-info.java eingerichtet ist: |
|

|
|
In der Datei steht, bei diesem Beispiel und im einfachsten Fall: |
|
/**
|
|
*
|
|
*/
|
|
/**
|
|
*
|
|
*/
|
|
module HS1 {
|
|
requires java.desktop;
|
|
}
|
|
4 Klassen, Objekte, Methoden |
|
Hier nun ein Blick auf das Einrichten von Klassen, das Instanziieren von Objekten und den Einsatz von Methoden. |
|
|
|
4.1 Klassen einrichten |
|
4.1.1 Grundlagen |
|
Mit Angabe der Attribute (Instanzvariablen) und dem Standardkonstruktor, einfachste Form (vgl. HS2, Stud.java): |
|
public class Studierende {
|
|
public String matrikelNr;
|
|
public String name;
|
|
public String vName; //Vorname
|
|
public String plz;
|
|
public String ort;
|
|
public String strasse;
|
|
public int hausnummer;
|
|
}
|
|
Mit Instanzattributen, einem Klassenattribut, einem ausgewiesenen Konstruktor und einer Methode (vgl. HS1, Stud.java): |
|
|
|
public class Stud { //Beginn der Klassendefinition
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName; //Vorname
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
|
|
static int anzStud = 0
|
|
Klassenattribut/statisches Attribut mit Anfangswert. Static bedeutet: Es ist ein Klassenattribut. D.h. seine Attributsausprägungen beziehen sich auf die Klasse als Ganzes, nicht auf einzelne Objekte. Programmiertechnisch bedeutet dies, dass seine Werte ohne Objektaufruf bearbeitet und aufgerufen werden können. |
|
|
|
public Stud () {
|
|
anzStud++;
|
|
}
|
|
Konstruktor, bei dem das Klassenatttribut für die Anzahl der Objekte der Klasse hochgezählt wird. |
|
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Instanzmethode zum Ausgeben der Daten eines Objekts: |
|
}
|
|
4.1.2 Sichtbarkeit |
|
Wie in der UML vorgesehen, kann auch in Java der Zugriff auf die Attribute und Methoden einer Klasse durch Sichtbarkeitsmodifizierer kontrolliert werden: |
Modifier |
- Public (öffentliches Attribut, öffentliche Variable, öffentliche Methode) bedeutet, auf die Klasse kann vom Paket aus, von abgeleiteten Klassen und von außerhalb zugegriffen werden.
- Protected (internes Attribut, interne Variable, interne Methode) bedeutet, es kann vom Paket aus und von von abgeleiteten Klassen zugegriffen werden.
- Paketsichtbar (package-private) ist eingestellt, falls kein Modifizierer angegeben wird. Diese Sichtbarket bedeutet, dass nur von anderen Klassen im gleichen Paket auf die Klasse zugegriffen werden kann.
- Private (privates Attribut, private Variable, private Methode) bedeutet, es kann nur innerhalb der Klasse zugegriffen werden.
|
|
Damit ist auch ein zentrales Anliegen der objektorientierten Theorie, die Möglichkeit der Methoden- und Datenkapselung, erfüllt. Daten, die auf Attributen/Variablen beruhen, und Methoden sollten nicht unberechtigt geändert bzw. aufgerufen werden können. Die Modifier Protected und Private erlauben dies in adäquater abgestufter Form. |
Kapseln |
Das Ganze wird noch verfeinert durch die Getter- und Setter-Methoden, die sozusagen trotz Kapselung den Zugriff über definierte Methoden erlauben: |
Getter, Setter |
- Eine Getter-Methode erlaubt trotz Zugriffsbeschränkungen den Zugriff auf die aktuelle Attributsausprägung eines Objekts.
- Eine Setter-Methode erlaubt trotz Zugriffsbeschränkungen das Beschreiben einer Attributsausprägung eines Objekts.
|
|
Beidesmal über Methoden, die bei der Klasse definiert sein müssen. Betrachten wir beispielhaft eine Klasse Stud (Studierende), wie sie unten in den Programmen sehr häufig vorkommt: |
Vgl. auch Projekt HS8 |
public class Stud {
|
|
public String mNr; //Matrikelnummer
|
|
private String name;
|
|
… |
|
Hier soll der Namen mit private gekapselt sein. Bei der Klasse werden dann die Getter- und Setter-Methoden in einfachster Form so hinterlegt: |
|
//Getter
|
|
public String getName(){
|
|
return name;
|
|
}
|
|
//Setter
|
|
public void setName(String name) {
|
|
this.name = name;
|
|
}
|
|
Dann kann im Hauptprogramm (also im selben Paket) der Name mit den Methoden getName() bzw. setName() gelesen oder überschrieben werden. Vgl. Projekt HS8. |
|
Pakete: Zusammenfassung der Klassen eines Projekts. Vgl. die Programme unten. Das Schlüsselwort ist package, die Deklaration erfolgt in der ersten Zeile des Programms, hier meist mit package hochschule. |
|
4.2 Objekte einrichten - Konstruktoren |
|
Hier einige Beispiele für Konstruktoren aus den folgenden Programmen. |
|
Der Standardkonstruktor (vgl. HS4), der automatisch aufgerufen wird: |
|
Noten n1 = new Noten();
|
|
N1 ist die Bezeichnung des neuen Objekts. |
|
Ein Konstruktor mit einer Klassenvariablen, die bei jeder Objekterzeugung hochgezählt wird (anzStud = Anzahl Studierende): |
|
public Stud () {
|
|
anzStud++; //Zähler für die Objekte der Klasse
|
|
}
|
|
Der Standardkonstruktor mit anschließendem Beschreiben des Objekts (vgl. HS5, HP): |
|
public class HS2 {
|
|
public static void main(String[] args) {
|
|
Stud s0 = new Stud(); //Aufruf Konstruktor
|
|
s0.mNr = 12345;
|
|
s0.name = "Sauer";
|
|
s0.vName = "Otto";
|
|
s0.anzSem = 5;
|
|
s0.gebTag = "21.09.2002";
|
|
Instanziierung mit Beschreiben des Objekts beim Aufruf des Konstruktors (vgl. HS4, HP): |
|
Aufruf im HP: |
|
Stud s0 = new Stud("1111", "Maier", "Klara", 5, "21.09.2002");
|
|
Konstruktor in Klasse Stud: |
|
public Stud (String mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
anzStud++;
|
|
}
|
|
Zu beachten ist das keyword this, das die Zuordnung der Parameterwerte auf die Attribute des Objektes realisiert. |
|
Verschachtelte Konstruktoren: |
|
stud1 = new BufferedReader (new FileReader("C://Meine Dateien// " + dateiBez + ".txt"));
|
|
Der eine Konstruktor ist Parameter im anderen. Näheres dazu in Abschnitt 6.1. |
|
Objektdaten bespielen mit Einlesen von der Konsole: |
|
eingabe = JOptionPane.showInputDialog("Matrikelnummer:");
|
|
stud.matrikelNr = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Name:");
|
|
stud.name = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Vorname:");
|
|
stud.vName = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Postleitzahl:");
|
|
stud.plz = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Ort:");
|
|
stud.ort = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Straße:");
|
|
stud.strasse = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Hausnummer: ");
|
|
stud.hausnummer = Integer.parseInt(eingabe);
|
|
Klasse Stud mit Objekt stud (vgl. HS1). Mit Einlesen von Konsole. |
|
4.3 Record-Klassen |
|
Java erlaubt die Anlage von sog. Record-Klassen, die wohl von den Datensätzen (records) relationaler Datenbanken motiviert sind. Sie erlauben eine schlankere Programmierung, v.a., weil sie eine schlankere Syntax aufweisen und weil einige Methoden gleich bei der Einrichtung durch den Konstruktor angelegt werden. |
Vgl. das Beispiel in Projekt HS6 |
Die Besonderheiten: |
|
- Record-Klassen verwalten für ihre Objekte nur Attribute (hier auch Record-Komponenten genannt).
- Ihre Objekte sind unveränderlich.
- Die Deklaration erfolgt mit dem Schlüsselwort record. Vgl. für die sonstige Syntax das Beispiel in Projekt HS6.
- Ihr Konstruktor übergibt in einer Parameterliste die Attributsausprägungen.
- Er erzeugt die Methoden equals(), toString() und hashCode(). Falls nötig, können sie verändert werden. Weitere Methoden können hinzugefügt werden.
- Für jedes Attribut wird eine Abfragemethode erstellt.
- Es gibt Schnittstellen, aber keine Vererbung
|
|
Die Methode equals() wird zum Vergleich von records verwendet. Sie sieht zwei records als gleich an, wennn sie vom gleichen Typ sind und falls jede Komponenten denselben Wert hat. Dies leistet hier der Gleichheitsoperator nicht. |
|
Der Zugriff auf die Instanzvariablen erfolgt über Methoden mit derselben Bezeichnung wie das jeweilige Attrbut. Gibt es also ein Attribut name, steht die Methode name() zur Verfügung. |
|
Das Beispiel in HS6 stellt dieses Programmierkonstrukt dar. |
|
Vgl. [Ullenboom 2024, S. 897], [Kofler 2023, S. 220f] und [Habelitz 2025, S. 387] für weitergehende Beschreibungen. |
|
4.4 Aufruf von Methoden und Attributen |
|
Hier wird gezeigt, wie der Aufruf von Methoden und Attributen in Java geregelt ist. |
|
Aufruf einer Instanzmethode aus dem HP heraus (HS2): |
|
public class HS2 {
|
|
public static void main(String[] args) {
|
|
Stud s0 = new Stud();//Standardkonstruktor
|
|
s0.mNr = 12345;
|
|
s0.name = "Sauer";
|
|
s0.vName = "Otto";
|
|
s0.anzSem = 5;
|
|
s0.gebTag = "21.09.2002";
|
|
System.out.println("\n------\n");
|
|
|
|
s0.ausgeben();
|
|
oben: Aufruf der Instanz-Methode von Klasse Stud. |
|
In Klasse Stud von HS1 wurde die Methode wie folgt angelegt: |
|
public class Stud {
|
|
.....
|
|
//Methode zum Ausgeben der Daten eines Objekts
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Aufruf eines Attributs (Variablen) einer anderen Klasse (HS4): |
|
System.out.println("\nAusgabe der Noten in Klasse HS4:");
|
|
System.out.println("Matrikelnummer: " + s1.mNr + "\nName: " + s1.name + "\nVorname: " + s1.vName + "\nFach: " + n1.fach + "\nNote: " + n1.note);
|
|
Mit Objektbezeichnung und Attributsname, verknüpft durch einen Punkt, wird die jeweilige Attributsausprägung angefordert. |
|
Das führt zu folgender Ausgabe: |
|

|
|
5 Prozedurales |
|
Java soll umfassend objektorientert sein. Es gibt nur Klassen, auch das Hauptprogramm ("main") soll in eine Klasse gepackt werden. Aber auch eine solche Programmiersprache benötigt prozedurale Komponenten, wenn es um die Realisierung von Methoden geht, um die dynamischen Aspekte der Anwendung. Es sind die üblichen von C und anderen prozeduralen Sprachen bekannten Konstrukte. Deren Ausprägung in Java wird hier kurz vorgestellt. |
|
|
|
5.1 Schleifen und Verzweigungen |
|
Eine While-Schleife mit enthaltener Switch-Verzweigung von Projekt HS2: |
|
boolean fertig = false;
|
|
while (!fertig) {
|
|
System.out.println(" ");
|
|
System.out.println("1 = Eingabe");
|
|
System.out.println("2 = Ausgabe");
|
|
System.out.println("3 = StudDaten wechseln");
|
|
System.out.println("4 = Programm beenden");
|
|
eingabe = JOptionPane.showInputDialog("Ihre Wahl");
|
|
int auswahl = Integer.parseInt(eingabe);
|
|
Oben: Menü auf der Konsole. Lesen der Nutzereingabe. |
|
|
|
switch(auswahl) {
|
|
Beginn der Switch-Verzweigungen, wie man es kennt mit case x und break. |
|
case 1:
|
|
eingabe = JOptionPane.showInputDialog("Matrikelnummer:");
|
|
stud.matrikelNr = eingabe;
|
|
.....
|
|
break;
|
|
case 2:
|
|
System.out.println(stud.matrikelNr);
|
|
System.out.println(stud.vName + " " + stud.name);
|
|
System.out.println(stud.plz + " " + stud.ort);
|
|
System.out.println(stud.strasse + " " + stud.hausnummer);
|
|
break;
|
|
case 3:
|
|
eingabe = JOptionPane.showInputDialog("Welcher Student (0 oder 1)?");
|
|
int nr = Integer.parseInt(eingabe);
|
|
|
|
if (nr == 0) {
|
|
stud = stud0;
|
|
}
|
|
else if (nr ==1) {
|
|
stud = stud1;
|
|
} else {
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
Verzweigung mit if/else. |
|
|
|
break;
|
|
case 4:
|
|
fertig = true;
|
|
break;
|
|
default:
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
}
|
|
Vgl. für weitergehende Informationen die Projektbeschreibung unten (HS2). |
|
5.2 Das Try/Catch-Konstrukt |
|
In Java wird ein Programmierkonstrukt angeboten, das kurz so beschrieben werden kann: Der Konstrollfluss wird unterteilt in einen Abschnitt mit dem gewünschten Ablauf ("try") und einen, der im Fehlerfall bei Laufzeitfehlern aktiv wird ("catch"). |
|
Der Try-Block kann unterschiedlich lang sein. Auch sehr kurz, z.B. für einen Einlesevorgang mit While-Schleife (hsdaten/Klasse Lesen) oder eine Arbeit mit dem Dateisystem, wie in hsdaten/Schreiben. Natürlich muss es ein zusammenhängender Abschnitt sein, so dass die Fehlermeldung im Catch-Block aussagekräftig ist. |
Vgl. die Beispiele im Projekt hsdaten. |
Die folgende Abbildung erläutert die Syntax am Beispiel eines Programmfragments von hsdaten/Erstellen.java. Mit try und catch werden die beiden Abschnitte getrennt. Im Try-Block findet sich ein Programmabschnitt, bei dem eine Datei in einem bestimmten Verzeichnis (hier unter Windows) eingerichtet werden soll. Der Fehler, dass die Datei bereits existiert, wird direkt im Programm abgefangen und dem Nutzer gemeldet. Eventuelle Laufzeitfehlermeldungen werden im Catch-Block ausgeführt. Dies sind erstmal vordefinierte Meldungen, die aber spezifiziert werden können. Vgl. Kapitel 7 und die dort gegebenen Hinweise. |
|

|
|
Abbildung 5.2-1: Das Try/Catch-Konstrukt in Java. |
|
Vgl. Kapitel 9 in [Habelitz 2025] für eine weitergehende Beschreibung. Für zahlreiche Beispiele vgl. die Projekte unten, va. hsdaten. |
|
6 Textdateien bearbeiten |
|
|
|
6.1 Paket java.io |
|
Die gesamte für die Arbeit mit Dateien notwendige Funktionalität ist im Paket java.io vorhanden. Davon werden hier nur die Lese- und Schreibvorgänge mit TXT-Dateien benötigt. Es geht also um Eingabeströme (Eingeben in die Datei) und Ausgabeströme (Lesen aus der Datei). Außerdem um das Einrichten und Arbeiten mit Verzeichnissen und Dateien. |
Vgl. die Abbildung unten. |
Die benötigten Komponenten von java.io müssen im jeweiligen Programm importiert werden. Entweder als Ganzes mit |
|
Import java.io.*
|
|
oder über die Klassen, z.B: so: |
|
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.FileWriter;
|
|
Zu den Klassen vgl. unten. |
|
6.2 Zugriffe mit Streams |
|
Bei den Eingabe- und Ausgabeströmen bzgl. Textdateien wird zwischen Character Streams und Byte Streams unterschieden: |
|
- Character Streams bestehen aus 16-Bit-Einheiten mit Char-Zeichen, kodiert nach Unicode.
- Byte Streams bestehen aus 8-Bit-Einheiten mit dem Datentyp Byte.
|
|
Die Basisfunktionalität wird durch abstrakte Klassen bereitgestellt. Dies sind Reader und Writer für Character Streams und InputStream sowie ExportStream für Byte Streams. Die eigentliche Arbeit leisten dann davon abgeleitete Klassen, die jeweils in ihrer Bezeichnung die der abstrakten Klasse enthalten. Zum Beispiel: |
|
- BufferedInputStream
- BufferedReader
- BufferedWriter
- FileWriter
- FileReader
|
|
6.3 Klasse File |
|
Die abstrakte Klasse File aus dem Paket java.io stellt die für den Umgang mit Dateien und Verzeichnissen benötigte Funktionalität zur Verfügung. Ein Objekt dieser Klasse repräsentiert jeweils ein Verzeichnis oder eine Datei. Im Fall von Dateien enthält das Objekt Daten wie Bezeichnung, Pfad, Größe, usw., nicht aber die Inhalte der Datei. |
File |
Eine wichtige der Klasse File zugeordnete Methode ist createNewFile(). Vgl. [hsdaten, Erstellen.java]. Mit dem Konstruktor |
|
Public File(String pathname)
|
|
wird ein Objekt von File im angegebenen Zugriffspfad eingerichtet. |
|
Die davon abgeleiteten Klassen tragen auch hier in ihrer Bezeichnung die der abstrakten Klasse. Zum Beispiel: |
|
- FileWriter. Richtet ein Objekt ein, mit dem in Dateien geschrieben werden kann. Es stellt die Verbindung her zu einer Datei aus dem Dateisystem des jeweiligen Rechners. Wichtige Methoden dieser Klasse sind write(), close().
- FileReader. (vgl. hsdaten/Lesen.java). Dessen "Objekte" stellen eine Verbindung zu einer Datei her, so dass ein zeilenweiser Lesezugriff ermöglicht wird.
- BufferedReader. Liest mit seiner Methode readLine() zeilenweise aus einer vom FileReader bereitgestellten Datei. Wenn das Ende der Datei erreicht ist, liefert readLine() als Ergebnis null.
- BufferedWriter. Liefert einen Eingabestrom, der "gepuffert" Unicode-Zeichen schreibt.
|
|
"Gepuffert" (buffered) meint hier, das der Ein- und Ausgabestrom nicht direkt ausgeführt wird. Die Daten werden also nicht zeitgleich mit der Lese- oder Schreibanweisung ausgeführt, sondern in einen Puffer geschrieben und erst transportiert, wenn der Puffer voll ist oder der Stream geschlossen wird. |
|
Beispiele |
|
hsdaten, Schreiben.java |
|
String dateiBez = "stud003";
|
|
stud1 = new FileWriter("C://Meine Dateien// " + dateiBez + ".txt");
|
|
String text = "Sinnspruch Nummer 3\n"
|
|
+ "Der Weg ist weit, der Weg ist lang,"
|
|
+ " doch uns wird - wie immer - nicht bang";
|
|
stud1.write(text);
|
|
stud1.close();
|
|
Erläuterung: |
|
- Im obigen Beispiel wird zuerst die Dateibezeichnung in eine String-Variable geschrieben.
- In der zweiten Zeile wird ein Objekt der Klasse FileWriter erzeugt mit den Angaben zum Verzeichnis und zur Datei.
- Dann wird die Stringvariable text beschrieben
- Anschließend wird mit der Instanzmethode write() in das Objekt stud1 der Text der String-Variablen geschrieben.
- Abschließend wird das Objekt stud1 wieder geschlossen.
|
|
Das Ergebnis (mit Notepad): |
|

|
|
hsdaten, Schreiben2.java, EinlesenCSV.java |
|
Hier nun ein Beispiel für den Einsatz der Klasse BufferedWriter bei einem Schreibvorgang. Zuerst wird ein FileWriter-Objekt erzeugt. Durch Verzicht auf Angabe eines Verzeichnissses, wird die Datei im Standardverzeichnis (hier, mit Windows 11: c:/eclipse/hsdaten) angelegt. |
|
Der Schreibvorgang soll mit BufferedWriter realisiert werden (obwohl diese Datenmenge dies nicht nahelegt). Dazu wird ein BufferedWriter-Objekt buwr erzeugt, das als Input das zuvor erstellte FileWriter-Objekt fiwr hat: |
|
FileWriter fiwr = new FileWriter("stud07.txt");
|
|
BufferedWriter buwr = new BufferedWriter(fiwr);
|
|
Danach kann dann in das Objekt (die Datei) buwr geschrieben werden. In hsdaten/schreiben2 geschieht dies mit den Methoden write() und newLine(). |
|
Das Zusammenwirken der beiden Klassen kann auch verschachtelt programmiert werden. Im folgenden Beispiel aus hsdaten/EinlesenCSV geht es um einen Lesevorgang. Gelesen wird aus der Datei mitarbeiter.csv. Die Verschachtelung erfolgt auf Basis der Konstruktoren der beiden Klassen. Der Konstruktor von BufferedReader erhält als Parameter die Instanziierung von FileReader, die als Parameter den Dateinamen über die Variable fileName hat. |
|
String fileName = "mitarbeiter.csv";
|
|
stud1 = new BufferedReader(new FileReader(fileName ));
|
|
java.util.Formatter |
|
Die unten auch verwendete Klasse java.util.Formatter dient (hier) dazu, die Eingaben in eine Textdatei zu formatieren. Hier ein Beispiel aus hsdaten/Anhaengen.java: |
|
File datei = new File("C://Meine Dateien// " + fileName + ".txt");
|
|
FileWriter writer = new FileWriter(datei, true);
|
|
Formatter formatter = new Formatter(writer)) {
|
|
Er benötigt ein Objekt der Klasse FileWriter als Parameter und stellt dann die benötigte Programmfunktionalität bereit. Die Methode format erlaubt dann die Spezifizierung: |
|
formatter.format("%s%n", newInput);
|
|
Vgl. die weiteren Ausführungen hierzu in hsdaten/Anhaengen.java. |
|
Die folgende Abbildung zeigt die hier verwendeten Klassen im Überblick. |
|

|
|
Abbildung 6.3-1: Klassen für Dateibearbeitung |
|
Da die IO-Klassen Systemressourcen benötigen, sollte man die entsprechenden Objekte schließen, wenn sie nicht mehr benötigt werden. Dies geschieht mit der Methode close(). |
|
Für weitergehende Beschreibungen vgl. die Literatur, z.B.: |
|
- [Ullenboom 2022, Abschnitt 20.4.4] für eine Beschreibung der Basisklase Writer und Abschnitt 20.4.6 für eine Beschreibung der Basisklasse Reader.
- [Ratz 2018, Kapitel 17] enthält eine verständliche und fundierte Darstellung der "Ein- und Ausgabe über I/O-Streams".
|
7 Exceptions |
|
Exceptions bedeutet hier Laufzeitfehler. Sie wurden in den unten gezeigten Programmen v.a. mit dem Try/catch-Konstrukt bei Zugriffen auf Dateien eingesetzt (IOExceptions). Exception ist auch eine Klasse, deren Objekte Fehlermeldungen sind. Die allgemeinste Fehlermeldung hat die Bezeichnung e. Sie kann auf den konkreten Fall zugeschnitten werden. |
|
In den jeweiligen Programmen muss diese Klasse mit import java.io.IOException importiert werden. Dies ist unten auch geschehen, v.a. für die Arbeit mit dem Dateisystem: |
|
- Zum Melden des Scheiterns der Methode createNewFile() (hsdaten/Erstellen.java) in einer Try/catch-Situation.
- Falls das Einrichten einer Datei und/oder des Schreibens in die Datei schief geht (hsdaten/Schreiben.java), ebenfalls in einer Try(catch-Situation.
- Beim Start eines Programms mit Dateizugriffen (hsdaten/Schreiben2.java).
|
|
Tiefergehendes hierzu, insbesondere zur Spezifikation der Fehlermeldungen, in Kürze. |
|
Vgl. für eine ausführliche Beschreibung [Habelitz 2025, Kapitel 9]. |
|
|
|
8 Projekt HS1 |
|
HS1 steht für das erste Projekt zum Anwendungsbereich Hochschule. |
|
Aufbau der Beschreibungen |
|
Der Aufbau dieser Projektbeschreibungen ist immer gleich: Zuerst das Hauptprogramm (Klasse HP), dann die inhaltlichen Klassen. Alle Programme werden zum einen ohne Erläuterungen angegeben, zum Kopieren und für den schnellen Überblick. Zum anderen aber auch mit Erläuterungen, für das schnelle Verstehen. Im letzten Abschnitt wird jeweils ein exemplarischer Programmlauf angegeben. |
|
Wie immer bei diesen Beispielsprojekten erfasst die Klasse HP den Programmablauf. Dazu wird wie immer in Java ein Hauptprogramm ("main") eingerichtet: |
|
public static void main(String[] args)
|
|
Zum Projekt HS1 |
|
Hier geht es schlicht darum, eine einfache Klasse Stud (Studierende) anzulegen, Objekte zu erzeugen und mit ihnen zu arbeiten. Die Klasse Stud beschreibt Studierende, ein weiterer Programmteil, sozusagen das Hauptprogramm (HP) beschreibt die dynamischen Aspekte, hier lediglich einige Handlungen mit den Objekten. |
|
Die Java-Erschaffer haben festgelegt, dass alle Programmelemente in Java-Programmen als Klassen angelegt werden müssen. Der gesamte Programmcode einer Anwendung ist also in Klassen gepackt, auch wenn dies manchmal keine Klassen im eigentlichen Sinn sind, wie schon das Beispiel hier mit dem Hauptprogramm ("main") und seinem Ablauf zeigt. |
|
|
|
8.1 Klasse HP |
|
Gleich zu Beginn wird ein Objekt erzeugt, s0 ("s" steht für Student/in). Dabei wird der Standardkonstruktorr verwendet. In der Klasse Stud ist zu sehen, dass es möglich ist, dem Standardkonstruktor ein Klassenattribut mit einer Wertezuweisung zuzuordnen. |
|
Nacheinander werden vier unterschiedliche Konstruktoren, die in der Klasse Stud angelegt sind, eingesetzt. Java wählt jeweils den geeigneten aus. D.h.: |
|
Eine Klasse kann verschiedene Konstruktoren besitzen. |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
Oben: Auch das jeweilige Hauptprogramm (HP / main) muss in eine Klasse gepackt sein, vgl. die Anmerkung oben. |
|
|
|
public static void main(String[] args) {
|
|
Stud s0 = new Stud(); //Objekt s0, Standardkonstruktor
|
|
Objekt s0 wird mit dem Standardkonstruktor erzeugt (instanziiert), das Klassenattribut anzStud (Anzahl Studierende) wird bearbeitet. Vgl. Klasse Stud. |
|
|
|
System.out.println("s0 ohne Daten, nach Instanziierung:\n");
|
|
s0.ausgeben();
|
|
Zur Veranschaulichung die Ausgabe der Objektdaten: Nach der Instanziierung sind die Attribute mit Default-Werten beschrieben. Das Klassenattribut anzStud hat den Wert 1. Unten wird gezeigt, dass der Werte des Klassenattributs bei jeder Instanziierung um 1 erhöht wird. |
|
|
|
Stud s1 = new Stud(); //Objekt s1
|
|
System.out.println("");
|
|
System.out.println("s1 ohne Daten, nach Instanziierung:\n");
|
|
s1.ausgeben();
|
|
Dasselbe wie oben, jetzt für das zweite Objekt s1. Das Klassenattribut hat jetzt den Wert 2. |
|
|
|
s0.mNr = 12345;
|
|
s0.name = "Sauer";
|
|
s0.vName = "Otto";
|
|
s0.anzSem = 5;
|
|
s0.gebTag = "21.09.2002";
|
|
Objekt s0 wird beschrieben. Dies ist einfach. Objekt- und Attributsbezeichnung identifizieren den konkreten Informationsträger, ansonsten Zuweisung wie bei Attributen. |
|
|
|
System.out.println("");
|
|
System.out.println("s0 beschrieben:\n");
|
|
s0.ausgeben();
|
|
Das Objekt s0 wird mit der Instanzmethode ausgeben() aus der zum Projekt gehörenden Klasse Stud auf der Konsole ausgegeben. Innerhalb desselben Projekts genügt der Aufruf ohne Klassenangabe. |
|
Bei jedem Aufruf der Methode wird der Wert des hochgezählten Attributs anzStud ausgegeben. Siehe Programmlauf. |
|
|
|
s1.mNr = 98765;
|
|
s1.name = "Widder";
|
|
s1.vName = "Andrea";
|
|
s1.anzSem = 2;
|
|
s1.gebTag = "2.7.2005";
|
|
System.out.println("");
|
|
System.out.println("s1 beschrieben:\n");
|
|
s1.ausgeben();
|
|
Auch das Objekt s1 wird beschrieben und ausgegeben. |
|
|
|
Stud s2 = new Stud(1111, "Maier", "Klara", 5, "21.09.2002");
|
|
System.out.println("\ns2 mit Daten vom Konstruktoraufruf:\n");
|
|
s2.ausgeben();
|
|
Nun der zweite Konstruktor, siehe Klasse Stud. Hier werden alle Attribute in der Parameterliste beschrieben. |
|
|
|
Stud s3 = new Stud(1111, "Maier", "Klara");
|
|
System.out.println("\ns3 mit teilweisen Daten vom Konstruktoraufruf:\n");
|
|
s3.ausgeben();
|
|
Der dritte Konstruktor erhält nur einen Teil der Attributsausprägungen über die Parameterliste: mNr, name, vName. Für die übrigen nimmt er die Standardwerte null bzw. 0. |
|
Java entscheidet aufgrund des Konstruktoraufrufs, hier auf Basis der Parameterliste, welcher der Konstruktoren aus der Klasse Stud verwendet wird. |
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
Stud s0 = new Stud(); //Objekt s0, Standardkonstruktor
|
|
|
|
System.out.println("s0 ohne Daten, nach Instanziierung:\n");
|
|
s0.ausgeben();
|
|
|
|
Stud s1 = new Stud(); //Objekt s1
|
|
System.out.println("");
|
|
System.out.println("s1 ohne Daten, nach Instanziierung:\n");
|
|
s1.ausgeben();
|
|
|
|
s0.mNr = 12345;
|
|
s0.name = "Sauer";
|
|
s0.vName = "Otto";
|
|
s0.anzSem = 5;
|
|
s0.gebTag = "21.09.2002";
|
|
System.out.println("");
|
|
System.out.println("s0 beschrieben:\n");
|
|
s0.ausgeben();
|
|
|
|
s1.mNr = 98765;
|
|
s1.name = "Widder";
|
|
s1.vName = "Andrea";
|
|
s1.anzSem = 2;
|
|
s1.gebTag = "2.7.2005";
|
|
System.out.println("");
|
|
System.out.println("s1 beschrieben:\n");
|
|
s1.ausgeben();
|
|
|
|
Stud s2 = new Stud(1111, "Maier", "Klara", 5, "21.09.2002");
|
|
System.out.println("\ns2 mit Daten vom Konstruktoraufruf:\n");
|
|
s2.ausgeben();
|
|
|
|
Stud s3 = new Stud(1111, "Maier", "Klara");
|
|
System.out.println("\ns3 mit teilweisen Daten vom Konstruktoraufruf:\n");
|
|
s3.ausgeben();
|
|
}
|
|
}
|
|
8.2 Klasse Stud |
|
Klasse Stud mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud { //Beginn der Klassendefinition
|
|
Oben: Beginn der Klassendefinition |
|
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName; //Vorname
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
Inhaltliche Attribute (Instanzattribute) zur Beschreibung der Objekte (Instanzen). |
|
|
|
static int anzStud = 0;
|
|
Definition eines Klassenattributs (statisches Attribut) mit Anfangswert. Static fixiert die Unveränderlichkeit, int legt den Datentyp fest und anzStud = 0 einen Anfangswert. |
|
|
|
public Stud () {
|
|
anzStud++; //Zähler für die Objekte der Klasse
|
|
}
|
|
Aufruf Konstruktor 1. Der Standardkonstruktor trägt Standardwerte in die Attribute des Objekts ein (o, null). Ergänzt hier durch den Wert des Klassenattributs anzStud. |
|
|
|
public Stud (int mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
anzStud++;
|
|
}
|
|
Aufruf Konstruktor 2, siehe Klasse Stud. Hier werden alle Attribute in der Parameterliste beschrieben |
|
|
|
public Stud (int mNr, String name, String vName) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
anzStud++;
|
|
}
|
|
Aufruf Konstruktor 3, siehe Klasse Stud. Dieser legt nur einen Teil der Attributsausprägungen in der Parameterliste fest: mNr, name, vName. Für die übrigen nimmt er die Standardwerte false, null oder 0. |
|
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
System.out.println("Anzahl Studierende: " + anzStud);
|
|
}
|
|
}
|
|
Instanzmethode zum Ausgeben der Daten eines Objekts. Das Klassenattribtu anzStud gibt jeweils an, wieviele Objekte angelegt sind. Vgl. Programmlauf. |
|
}
|
|
}
|
|
Klasse Stud ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud { //Beginn der Klassendefinition
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName; //Vorname
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
static int anzStud = 0;
|
|
public Stud () {
|
|
anzStud++; //Zähler für die Objekte der Klasse
|
|
}
|
|
public Stud (int mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
anzStud++;
|
|
}
|
|
public Stud (int mNr, String name, String vName) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
anzStud++;
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
System.out.println("Anzahl Studierende: " + anzStud);
|
|
}
|
|
}
|
|
8.3 Programmlauf |
|
s0 ohne Daten, nach Instanziierung:
|
|
|
|
Matrikelnummer: 0
|
|
Name: null
|
|
Vorname:null
|
|
Erreichtes Semester: 0
|
|
Geburtstag: null
|
|
Anzahl Studierende: 1
|
|
|
|
s1 ohne Daten, nach Instanziierung:
|
|
|
|
Matrikelnummer: 0
|
|
Name: null
|
|
Vorname:null
|
|
Erreichtes Semester: 0
|
|
Geburtstag: null
|
|
Anzahl Studierende: 2
|
|
|
|
s0 beschrieben:
|
|
|
|
Matrikelnummer: 12345
|
|
Name: Sauer
|
|
Vorname:Otto
|
|
Erreichtes Semester: 5
|
|
Geburtstag: 21.09.2002
|
|
Anzahl Studierende: 2
|
|
|
|
s1 beschrieben:
|
|
|
|
Matrikelnummer: 98765
|
|
Name: Widder
|
|
Vorname:Andrea
|
|
Erreichtes Semester: 2
|
|
Geburtstag: 2.7.2005
|
|
Anzahl Studierende: 2
|
|
|
|
s2 mit Daten vom Konstruktoraufruf:
|
|
|
|
Matrikelnummer: 1111
|
|
Name: Maier
|
|
Vorname:Klara
|
|
Erreichtes Semester: 5
|
|
Geburtstag: 21.09.2002
|
|
Anzahl Studierende: 3
|
|
|
|
s3 mit teilweisen Daten vom Konstruktoraufruf:
|
|
|
|
Matrikelnummer: 1111
|
|
Name: Maier
|
|
Vorname:Klara
|
|
Erreichtes Semester: 0
|
|
Geburtstag: null
|
|
Anzahl Studierende: 4
|
|
9 Projekt HS2 |
|
Hier werden zwei Objekte (stud0 und stud1) eingerichtet und bearbeitet. Es soll deutlich werden, dass bei einer Vorgehensweise wie hier ein Objekt das aktive ist. Um dies zu vereinfachen, werden gleich zwei Objekte angelegt, mit denen dies geprüft werden kann. Es gibt ein Konsolenmenü ... |
|

|
|
... mit einer grafischen Eingabe per JOptionPane.showInputDialog (siehe Programmlauf). |
|
Da im Programm schon zwei Objekte angelegt sind, kann der Punkt 3 gleich ausprobiert werden. Dazu wird zuerst 2 angefordert, was zur Anzeige des aktiven Objekts führt. Dann wird mit 3 das Objekt gewechselt und wiederum mit 2 das jetzt aktive Objekt angezeigt. |
|
Mit 1 können neue Objekte eingegeben werden, die dann jeweils das aktive sind. Wie zu sehen ist, werden immer nur zwei Objekte bereitgehalten. |
|
|
|
9.1 Klasse HP |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
import javax.swing.JOptionPane;
|
|
Oben: Anmelden der Klasse javax.swing für die grafische Eingabe. |
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
String eingabe;
|
|
Stud stud0 = new Stud();
|
|
Stud stud1 = new Stud();
|
|
Oben: Erzeugen zweier Objekte mit dem Standardkonstruktor. |
|
|
|
Stud stud = stud0;
|
|
Weiteres Objekt, mit Referenzcharakter. |
|
|
|
//Daten zum Testen:
|
|
stud0.matrikelNr = "12345";
|
|
stud0.name = "Erster";
|
|
stud0.vName= "Paul";
|
|
stud0.plz = "7878";
|
|
stud0.ort="Weingarten";
|
|
stud0.strasse="Hinterm Berg";
|
|
stud0.hausnummer=99;
|
|
|
|
stud1.matrikelNr = "12345";
|
|
stud1.name = "Zweite";
|
|
stud1.vName= "Viola";
|
|
stud1.plz = "8989";
|
|
stud1.ort="Ravensburg";
|
|
stud1.strasse="Hauptstr.";
|
|
stud1.hausnummer=88;
|
|
Damit nicht gleich zum Ausprobieren Daten eingegeben werden müssen, werden stud0 und stud1 mit Daten beschrieben. So ist es möglich, gleich nach dem Start die Ausgabe mit dem aktiven Objekt anzufordern (es kommt stud0), dann mit Punkt 3 das aktive Objekt zu wechseln (auf 1) und dieses wieder auszugeben. Das ist dann stud1. |
|
|
|
System.out.println("Eingabe von Daten in die ");
|
|
System.out.println("Studierendendatei");
|
|
System.out.println("-------------------------------");
|
|
Überschrift zur Konsolenausgabe |
|
|
|
boolean fertig = false;
|
|
while (!fertig) {
|
|
Beginn einer While-Schleife. Ende siehe unten. |
|
|
|
System.out.println(" ");
|
|
System.out.println("1 = Eingabe");
|
|
System.out.println("2 = Ausgabe");
|
|
System.out.println("3 = Aktives Objekt wechseln");
|
|
System.out.println("4 = Programm beenden");
|
|
Menüauswahl auf Konsole. Anzeige siehe unten. Die Anforderung einer Leerzeile mit System.out.println(" ") wird unabhängig vom konkreten Betriebssystem realisiert, ist also plattformübergreifend. |
|
|
|
eingabe = JOptionPane.showInputDialog("Ihre Wahl");
|
|
Einlesen der Eingabe in die String-Variable Eingabe. |
|
|
|
int auswahl = Integer.parseInt(eingabe);
|
|
Die String-Variable eingabe wird in einen Integer-Wert gewandelt ("parseInt") und in die Integer-Variable auswahl geschrieben. |
|
|
|
System.out.println("\nEingegeben wurde: " + auswahl + "\n");
|
|
switch(auswahl) {
|
|
Verzweigung mit switch auf Basis der Nutzereingaben, die in Integerwerte gewandetl wurden. |
|
|
|
case 1: // Studierendendaten eingeben
|
|
eingabe = JOptionPane.showInputDialog("Matrikelnummer:");
|
|
stud.matrikelNr = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Name:");
|
|
stud.name = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Vorname:");
|
|
stud.vName = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Postleitzahl:");
|
|
stud.plz = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Ort:");
|
|
stud.ort = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Straße:");
|
|
stud.strasse = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Hausnummer: ");
|
|
stud.hausnummer = Integer.parseInt(eingabe);
|
|
break;
|
|
Studierendendaten eingeben. Bespielt wird Objekt stud. Es erfolgt jeweils eine grafische Anzeige der Eingabeaufforderung (vgl. unten) und das Übertragen der Nutzereingabe in die String-Variable eingabe. Diese wird in das entsprechende Objektattribut geschrieben. Für die Hausnummer wurde die Umwandlung des Strings in eine Integerzahl vorgenommen (mit parseInt). |
|
break: Wird für jede Case-Variante verlangt. Damit wird die Switch-Verzweigung verlassen. |
|
|
|
case 2:
|
|
System.out.println(stud.matrikelNr);
|
|
System.out.println(stud.vName + " " + stud.name);
|
|
System.out.println(stud.plz + " " + stud.ort);
|
|
System.out.println(stud.strasse + " " + stud.hausnummer);
|
|
break;
|
|
Diese Wahl führt zur Ausgabe der Studierendendaten des jeweils "aktiven" Objekts. |
|
|
|
case 3: //StudDaten wechseln
|
|
Hier sollen die Daten der zwei Objekte getauscht werden. |
|
|
|
eingabe = JOptionPane.showInputDialog("Welcher Student (0 oder 1)?");
|
|
int nr = Integer.parseInt(eingabe);
|
|
if (nr == 0) {
|
|
stud = stud0;
|
|
stud0 wird auf stud gespielt - nur REFERENZ! |
|
|
|
} else if (nr ==1) {
|
|
stud = stud1;
|
|
stud1 wird auf stud gespielt - nur REFERENZ! |
|
|
|
} else {
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
System.out.println("\nAktives Objekt wurde geändert!\n");
|
|
break;
|
|
Einfaches Beispiel für die Arbeit mit Objekten. Jeweils ein Objekt soll das aktive sein. Dieses wird mit stud verknüpft, d.h. stud stellt einen Verweis auf das ausgewählte Objekt dar. |
|
|
|
case 4: // Programm beenden
|
|
fertig = true;
|
|
Bei Wahl der Zahl 4 wird das Programm beendet. |
|
|
|
break;
|
|
default:
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import javax.swing.JOptionPane;
|
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
String eingabe;
|
|
Stud stud0 = new Stud();
|
|
Stud stud1 = new Stud();
|
|
Stud stud = stud0;
|
|
|
|
stud0.matrikelNr = "12345";
|
|
stud0.name = "Erster";
|
|
stud0.vName= "Paul";
|
|
stud0.plz = "7878";
|
|
stud0.ort="Weingarten";
|
|
stud0.strasse="Hinterm Berg";
|
|
stud0.hausnummer=99;
|
|
|
|
stud1.matrikelNr = "12345";
|
|
stud1.name = "Zweite";
|
|
stud1.vName= "Viola";
|
|
stud1.plz = "8989";
|
|
stud1.ort="Ravensburg";
|
|
stud1.strasse="Hauptstr.";
|
|
stud1.hausnummer=88;
|
|
|
|
boolean fertig = false;
|
|
System.out.println("Eingabe von Daten in die ");
|
|
System.out.println("Studierendendatei");
|
|
System.out.println("-------------------------------");
|
|
|
|
while (!fertig) {
|
|
System.out.println(" ");
|
|
System.out.println("1 = Eingabe");
|
|
System.out.println("2 = Ausgabe");
|
|
System.out.println("3 = Aktives Objekt wechseln");
|
|
System.out.println("4 = Programm beenden");
|
|
eingabe = JOptionPane.showInputDialog("Ihre Wahl");
|
|
int auswahl = Integer.parseInt(eingabe);
|
|
System.out.println("\nEingegeben wurde: " + auswahl + "\n");
|
|
switch(auswahl) {
|
|
case 1:
|
|
eingabe = JOptionPane.showInputDialog("Matrikelnummer:");
|
|
stud.matrikelNr = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Name:");
|
|
stud.name = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Vorname:");
|
|
stud.vName = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Postleitzahl:");
|
|
stud.plz = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Ort:");
|
|
stud.ort = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Straße:");
|
|
stud.strasse = eingabe;
|
|
eingabe = JOptionPane.showInputDialog("Hausnummer: ");
|
|
stud.hausnummer = Integer.parseInt(eingabe);
|
|
break;
|
|
case 2:
|
|
System.out.println(stud.matrikelNr);
|
|
System.out.println(stud.vName + " " + stud.name);
|
|
System.out.println(stud.plz + " " + stud.ort);
|
|
System.out.println(stud.strasse + " " + stud.hausnummer);
|
|
break;
|
|
case 3:
|
|
eingabe = JOptionPane.showInputDialog("Welcher Student (0 oder 1)?");
|
|
int nr = Integer.parseInt(eingabe);
|
|
if (nr == 0) {
|
|
stud = stud0; //stud0 wird auf stud gespielt - nur REFERENZ
|
|
} else if (nr ==1) {
|
|
stud = stud1;
|
|
} else {
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
System.out.println("\nAktives Objekt wurde geändert!\n");
|
|
break;
|
|
case 4: // Programm beenden
|
|
fertig = true;
|
|
break;
|
|
default:
|
|
System.out.println("Eingabefehler!");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
9.2 Klasse Stud |
|
Diese Klasse besteht nur aus der Klassendefinition. |
|
package hochschule;
|
|
|
|
public class Studierende {
|
|
public String matrikelNr; //Instanzvariablen
|
|
public String name;
|
|
public String vName;
|
|
public String plz;
|
|
public String ort;
|
|
public String strasse;
|
|
public int hausnummer;
|
|
}
|
|
9.3 Beispielhafter Programmlauf |
|
Nach dem Start des Programms erscheint das Konsolenmenü und die grafische Eingabeaufforderung. Diese wird auch für die Eingabe der Daten genutzt. |
|
Folgende zwei Eingabemasken sind eingebaut: |
|

|
|
|
|

|
|
|
|
Die Ausgabe auf Bildschirm: |
|
Eingabe von Daten in die
|
|
Studierendendatei
|
|
-------------------------------
|
|
|
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde: 2
|
|
|
|
12345
|
|
Paul Erster
|
|
7878 Weingarten
|
|
Hinterm Berg 99
|
|
D.h., Diese Adresse (stud0) ist vorne. |
|
|
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde: 3
|
|
|
|
|
|
Aktives Objekt wurde geändert!
|
|
Stud1 "ist jetzt vorne" |
|
|
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde: 2
|
|
|
|
23456
|
|
Viola Zweite
|
|
8989 Ravensburg
|
|
Hauptstr. 88
|
|
Tatsächlich |
|
|
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde: 1
|
|
Ein weiteres Objekt wird eingegeben. |
|
|
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde: 2
|
|
|
|
34567
|
|
Pauline Dritte
|
|
7676 Konstanz
|
|
Seeweg 99
|
|
Da ist es. |
|
1 = Eingabe
|
|
2 = Ausgabe
|
|
3 = Aktives Objekt wechseln
|
|
4 = Programm beenden
|
|
|
|
Eingegeben wurde:4
|
|
10 Projekt HS3 |
|
Array mit Objekten, zufallsgeneriert |
|
In diesem Projekt werden mehrere Objekte mit zufallsgenerierten fiktiven Daten erzeugt. Damit man nicht die Objekte einzeln im Progamm instanziieren muss, wird ein Array zu Hilfe genommen, in dem die Objekte per Programm angelegt werden. Ein solches Array wird auch komplexes Objekt genannt. |
|
Im Programm HP wird zuerst gefragt, wieviele Objekte generiert werden sollen, dann wird ein Array mit dieser Länge angelegt. In diesem werden dann gleich viele Objekte mit Leereinträgen erstellt. Diese haben die Attributsausprägungen 0 (für numerische Instanzvariablen), null (für Strings) und false (für boolesche Attribute). Damit liegt also ein Array mit Objekten vor. Wie üblich, sind die Positionen des Arrays nummeriert, beginnend mit 0. Wenn es also 50 Objekte sind, haben diese die Nummerierungen 0 bis 49 und die Adressen studiosi[i] für i gleich 0 bis 49. Über diese Array-Adresse können die Objekte angesprochen werden. |
studiosi[] |
Für die zu generierenden Objekte liegen zwei String-Arrays vor, einer mit 20 Nachnamen, einer mit 20 Vornamen. Auf deren Basis werden mit Hilfe der Methode java.util.Random() zufällige Namen und Vornamen erzeugt. Auch die übrigen Attributsausprägungen werden zufällig generiert. |
|
Wichtige Aspekte sind hier also: |
|
- Erzeugen eines Arrays aus Objekten (komplexes Objekt)
- Nutzung der Methode Random
|
|
Außerdem werden mit Hilfe der Klasse javax.swing.JoptionPane grafische Eingabemöglichkeiten genutzt: |
|

|
|
|
|
In diesem Beispiel wird, wie immer in dieser Lesehilfe, nicht die Nutzereingabe und "Tiefensemantik" kontrolliert. Z.B. könnte das Programm zwei gleiche Namenskombinationen oder Matrikelnummern erzeugen. |
|
|
|
10.1 Klasse HP |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.util.Random;
|
|
Oben: Klasse Random für die Erzeugung von Zufallszahlen. |
|
|
|
import javax.swing.JOptionPane;
|
|
Klasse für die Methode JOptionPane.showInputDialog(). |
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
System.out.println("---Objekte mit generierten Daten anlegen\n");
|
|
String eingabe;
|
|
int ianz;
|
|
eingabe = JOptionPane.showInputDialog("Wieviele Objekte (maximal 100):");
|
|
ianz = Integer.parseInt(eingabe);
|
|
Erfragen der Anzahl Objekte, d.h. der gewünschten Länge des Array. Um den String eingabe in eine Integerzahl zu wandeln wird parseInt eingesetzt. |
|
|
|
System.out.println("Anzulegende Objekte: " + ianz);
|
|
System.out.println();
|
|
Stud[] studiosi = new Stud[ianz];
|
|
Der Konstruktoraufruf new Stud[ianz] führt zu einem Feld (array) der gewünschten Länge mit "Leer-Objekten". |
|
studiosi : Feld von Objekten |
|
|
|
String[] namen = {"Ritter", "Knecht", "Maier", "Müller",
|
|
"Stauder", "Siskor", "Oduro", "Picarda", "Ricker", "Maistro",
|
|
"Müller", "Studer", "Saskor", "Podur", "Prickel", "Ricker",
|
|
"Bond", "Jones", "Riker", "Nobel"};
|
|
String[] vornamen = {"Paul", "Frieder", "Angelika", "Karolin",
|
|
"Xian", "Ezri", "Jadzia", "Miriam", "Elfriede", "Josef",
|
|
"Guiseppe", "Angie", "Frieda", "Andrea", "Karolin", "Ludwig",
|
|
"Ricardo", "Andrea", "Lisa", "Friedrich"};
|
|
Anlage zweier Zeichenketten mit Namen und Vornamen, die im Programm zufällig für die Objekte zusammengestellt werden. Jeweils 20 Nachnamen und 20 Vornamen. |
|
|
|
for (int i=0; i< studiosi.length; i++) {
|
|
studiosi[i] = new Stud();
|
|
}
|
|
Zuerst einmal werden in der gewünschten Anzahl "leere" Objekte erzeugt. |
|
|
|
System.out.print("Inhalte generieren und Objekte ausgeben\n");
|
|
var r = new Random();
|
|
Ein neues Objekt r der Klasse Random wird erzeugt. |
|
|
|
int nr = 0;
|
|
while (nr >= 0 amp;amp; nr < studiosi.length amp;amp; nr <= ianz) {
|
|
In dieser While-Schleife werden die Objekte mit zufällig generierten Attributsausprägungen bespielt. |
|
|
|
System.out.println();
|
|
System.out.print("Objekt nr = " + nr);
|
|
|
|
//Matrikelnummer
|
|
int mNr = r.nextInt(10000, 20000);
|
|
studiosi[nr].mNr = mNr;
|
|
Die Matrikelnummern sollen zwischen den obigen zwei Werten liegen. Um bei diesem Zufallsprozess zwei gleiche zu verhindern, müsste eine entsprechende Kontrolle eingefügt werden. |
|
|
|
//Namen
|
|
int tt = r.nextInt(20);
|
|
String name = namen[tt];
|
|
studiosi[nr].name = name;
|
|
Der Nachnamen wird zufällig aus dem String-Array namen bestimmt. |
|
|
|
//Vornamen
|
|
int tu = r.nextInt(20);
|
|
String vName = vornamen[tu];
|
|
studiosi[nr].vName = vName;
|
|
Der Vorname wird zufällig aus dem String-Array vornamen bestimmt. |
|
|
|
//Semesteranzahl
|
|
int ii = r.nextInt(1, 20);
|
|
studiosi[nr].anzSem = ii;
|
|
Generierung einer zufälligen Semesteranzahl. |
|
|
|
//Datum generieren
|
|
//Monat
|
|
int monatber = r.nextInt(12);
|
|
Generierung eine zufälligen Monats für das Geburtsdatum. |
|
|
|
//Tag
|
|
int tagber = 0;
|
|
if (monatber == 2) {
|
|
tagber = r.nextInt(1, 29);
|
|
} else if ((monatber == 1) || (monatber == 3) || (monatber == 5) || (monatber == 7) || (monatber == 10) || (monatber == 12)) {
|
|
tagber = r.nextInt(1, 30);
|
|
}
|
|
else {
|
|
tagber = r.nextInt(1, 31);
|
|
}
|
|
//Jahr
|
|
int jahrber = r.nextInt(1995, 2007);
|
|
String monats = monatber + ".";
|
|
String jahrs = jahrber + " ";
|
|
String tags = tagber + ".";
|
|
studiosi[nr].gebTag = tags + monats + jahrs;
|
|
System.out.println();
|
|
studiosi[nr].ausgeben();//Methode in Klasse Stud
|
|
nr++;
|
|
}
|
|
System.out.println("\nAnzahl Studierende: " + Stud.anzStud + "\n");
|
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.util.Random;
|
|
import javax.swing.JOptionPane;
|
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
System.out.println("---Objekte mit generierten Daten anlegen\n");
|
|
String eingabe;
|
|
int ianz;
|
|
eingabe = JOptionPane.showInputDialog("Wieviele Objekte (maximal 100):");
|
|
ianz = Integer.parseInt(eingabe);
|
|
|
|
System.out.println("Anzulegende Objekte: " + ianz);
|
|
System.out.println();
|
|
Stud[] studiosi = new Stud[ianz];
|
|
|
|
String[] namen = {"Ritter", "Knecht", "Maier", "Müller",
|
|
"Stauder", "Siskor", "Oduro", "Picarda", "Ricker", "Maistro",
|
|
"Müller", "Studer", "Saskor", "Podur", "Prickel", "Ricker",
|
|
"Bond", "Jones", "Riker", "Nobel"};
|
|
String[] vornamen = {"Paul", "Frieder", "Angelika", "Karolin",
|
|
"Xian", "Ezri", "Jadzia", "Miriam", "Elfriede", "Josef",
|
|
"Guiseppe", "Angie", "Frieda", "Andrea", "Karolin", "Ludwig",
|
|
"Ricardo", "Andrea", "Lisa", "Friedrich"};
|
|
|
|
for (int i=0; i< studiosi.length; i++) {
|
|
studiosi[i] = new Stud();
|
|
}
|
|
System.out.print("Inhalte generieren und Objekte ausgeben\n");
|
|
var r = new Random();
|
|
int nr = 0;
|
|
while (nr >= 0 amp;amp; nr < studiosi.length amp;amp; nr <= ianz) {
|
|
System.out.println();
|
|
System.out.print("Objekt Nr = " + nr);
|
|
//Matrikelnummer
|
|
int mNr = r.nextInt(10000, 20000);
|
|
studiosi[nr].mNr = mNr;
|
|
//Namen
|
|
int tt = r.nextInt(20);
|
|
String name = namen[tt];
|
|
studiosi[nr].name = name;
|
|
//Vornamen
|
|
int tu = r.nextInt(20);
|
|
String vName = vornamen[tu];
|
|
studiosi[nr].vName = vName;
|
|
//Semesteranzahl
|
|
int ii = r.nextInt(1,20);
|
|
studiosi[nr].anzSem = ii;
|
|
//Datum generieren
|
|
//Monat
|
|
int monatber = r.nextInt(12);
|
|
|
|
//Tag
|
|
int tagber = 0;
|
|
if (monatber == 2) {
|
|
tagber = r.nextInt(1, 29);
|
|
} else if ((monatber == 1) || (monatber == 3) || (monatber == 5) || (monatber == 7) || (monatber == 10) || (monatber == 12)) {
|
|
tagber = r.nextInt(1, 30);
|
|
}
|
|
else {
|
|
tagber = r.nextInt(1, 31);
|
|
}
|
|
//Jahr
|
|
int jahrber = r.nextInt(1995, 2007);
|
|
String monats = monatber + ".";
|
|
String jahrs = jahrber + " ";
|
|
String tags = tagber + ".";
|
|
studiosi[nr].gebTag = tags + monats + jahrs;
|
|
System.out.println();
|
|
studiosi[nr].ausgeben();//Methode in Klasse Stud
|
|
nr++;
|
|
}
|
|
System.out.println("\nAnzahl Studierende: " + Stud.anzStud + "\n");
|
|
}
|
|
}
|
|
10.2 Klasse Stud |
|
Klasse Stud mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
static int anzStud = 0;
|
|
Oben: Klassenattribut/statisches Attribut mit Anfangswert. |
|
|
|
public Stud () {
|
|
anzStud++;
|
|
}
|
|
Konstruktor mit Klassenattribut. |
|
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Methode zum Ausgeben der Daten eines Objekts |
|
}
|
|
Klasse Stud ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
static int anzStud = 0;
|
|
public Stud () {
|
|
anzStud++;
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
}
|
|
10.3 Programmlauf |
|
Hier wurden aus Platzgründen nur drei Objekte angefordert. |
|
---Objekte mit generierten Daten anlegen
|
|
|
|
Anzulegende Objekte: 3
|
|
|
|
Inhalte generieren und Objekte ausgeben
|
|
|
|
Objekt Nr = 0
|
|
Matrikelnummer: 17591
|
|
Name: Saskor
|
|
Vorname: Jadzia
|
|
Erreichtes Semester: 17
|
|
Geburtstag: 27.10.2006
|
|
|
|
Objekt Nr = 1
|
|
Matrikelnummer: 16863
|
|
Name: Ricker
|
|
Vorname: Miriam
|
|
Erreichtes Semester: 14
|
|
Geburtstag: 13.3.2005
|
|
|
|
Objekt Nr = 2
|
|
Matrikelnummer: 15464
|
|
Name: Oduro
|
|
Vorname: Ezri
|
|
Erreichtes Semester: 3
|
|
Geburtstag: 20.0.2002
|
|
|
|
Anzahl Studierende: 3
|
|
11 Projekt HS4 |
|
Hier werden Aufrufe über Klassengrenzen hinweg demonstriert, darunter auch eine, die zur Verknüpfung von Inhalten führt. Neben der Klasse mit dem HP liegen zwei inhaltlich motivierte Klassen vor: Stud (Studierende) und Noten. |
|
|
|
11.1 Klasse HP |
|
Zu Beginn werden mittels zweier Konstruktoraufrufe die Objekte (Studierenden) s0 und s1 instanziiert und deren Daten ausgegeben. Anschließend erfolgt der Konstruktoraufruf zur Klasse Noten. Auch hier werden die Daten per Parameteraufruf eingetragen. Abschließend wird die Ausgabe verknüpfter Daten gezeigt. Insgesamt erfolgt hier an folgenden Stellen ein Aufruf einer anderen Klasse: |
|
- s0.ausgeben() ruft im HP eine Methode der Klasse Stud auf.
- s1.name, usw. fordert im HP aus Stud die Daten des Objekts an.
- n1.fach fordert von Noten das Studienfach der Notenvergabe an, usw.
|
|
In Stud ist ein Klassenattribut eingefügt: anzStud. Es hält die Anzahl der Studierenden (die Anzahl der Objekte von Stud) fest. Das Hochzählen erfolgt im Konstruktor von Stud. |
Klassen-
attribut |
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
|
|
Stud s0 = new Stud("123", "Maier", "Klara", 5, "21.09.2002");
|
|
Oben: Konstruktor für das Objekt s0. Die Attribute des Objekts werden über die Parameterliste des Konstruktors befüllt. Vgl. Stud für den entsprechenden Aufbau des Konstruktors. |
|
|
|
System.out.println("Ausgabe der Daten in HP mit Methode der Klasse Stud:");
|
|
s0.ausgeben();
|
|
Aufruf der Instanzmethode ausgeben() der Klasse Stud.java. |
|
|
|
Stud s1 = new Stud("234", "Müller", "Ulla", 5, "1.1.1999");
|
|
s1.ausgeben();
|
|
Ein weiteres Objekt von Stud entsteht und wird ausgegeben. |
|
|
|
Noten n1 = new Noten("234", "EinfWI", "3,5");
|
|
n1.ausgNote();
|
|
Konstruktor der Klasse Noten mit Dateneingabe per Parameter,. Es entsteht Objekt n1. EinfWI bedeutet: Einführung in die Wirtschaftsinformatik. Dann erfolgt der Aufruf der Instanzenmethode ausgNote() zur Ausgabe der Noten. |
|
|
|
System.out.println("\nAusgabe der Noten in Klasse HP:");
|
|
System.out.println("Matrikelnummer: " + s1.mNr + "\nName: " + s1.name + "\nVorname: " + s1.vName + "\nFach: " + n1.fach + "\nNote: " + n1.note);
|
|
Mit diesem Befehl werden, von HP aus, verknüpfte Daten von s1 und n1 ausgegeben. Das Beispiel ist aus didaktischen Gründen stark fokussiert auf die Aufruf- und Konstruktorthematik. In Wirklichkeit müssten natürlich die passenden Studierenden und Noten zuerst gesucht werden. |
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
Stud s0 = new Stud("123", "Maier", "Klara", 5, "21.09.2002");
|
|
System.out.println("Ausgabe der Daten in HP mit Methode der Klasse Stud:");
|
|
s0.ausgeben();
|
|
Stud s1 = new Stud("234", "Müller", "Ulla", 5, "1.1.1999");
|
|
s1.ausgeben();
|
|
Noten n1 = new Noten("123", "EinfWI", "3,5");
|
|
n1.ausgNote();
|
|
System.out.println("\nAusgabe der Noten in Klasse HP:");
|
|
System.out.println("Matrikelnummer: " + s1.mNr + "\nName: "
|
|
+ s1.name + "\nVorname: " + s1.vName + "\nFach: " + n1.fach
|
|
+ "\nNote: " + n1.note);
|
|
}
|
|
}
|
|
11.2 Klasse Noten |
|
Die Klasse Noten erfasst mit den Attributen mNr (Matrikelnummer), fach (Studienfach) und Note (erreichte Note in Klausur, mündlicher Prüfung, Hausarbeit, usw.).die Noten der Studierenden. |
|
Der Konstruktor ist wiederum so angelegt, dass die Attributsausprägungen (Werte) gleich beim Aufruf übergeben werden. Eine Methode ausgNote() erlaubt es, die Noten eines Studierenden bzgl. eines Faches anzeigen zu lassen. |
|
Klasse Noten mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class Noten {
|
|
public String mNr; //Matrikelnummer
|
|
public String fach; //Studienfach
|
|
public int note;
|
|
|
|
public Noten(String matrNr, String fach, String note)
|
|
{
|
|
this.mNr = matrNr;
|
|
this.fach = fach;
|
|
this.note = 2;
|
|
}
|
|
Oben: Ein Konstruktor mit Werteübergabe in der Parameterliste. Damit entsteht dann nicht ein unbeschriebenes Objekt mit 0, null und false, sondern gleich eines mit beschriebenen Attributsausprägungen. |
|
Der Aufruf im HP ist wie folgt: Noten n1 = new Noten("12345", "EinfWI", "3,5"). Zu beachten ist die Zuweisung der übergebenen Werte an die Attribute des Objekts mittels this. |
|
|
|
void ausgNote() {
|
|
System.out.println("\nAusgabe der Daten in Klasse Noten:");
|
|
System.out.println("Student (Matrikelnummer): " + mNr);
|
|
System.out.println("Fach: " + fach);
|
|
System.out.println("Note: " + note);
|
|
}
|
|
Definition der Instanzmethode ausgNote(). Diese steht dann im gesamten Programm zur Verfügung, dank package hochschule. Aufruf im HP z.B. so: n1.ausgNote(). |
|
}
|
|
Klasse Noten ohne Erläuterungen |
|
package hochschule;
|
|
public class Noten {
|
|
public String mNr; //Matrikelnummer
|
|
public String fach;
|
|
public int note;
|
|
public Noten(String matrNr, String fach, String note)
|
|
{
|
|
this.mNr = matrNr;
|
|
this.fach = fach;
|
|
this.note = 2;
|
|
}
|
|
void ausgNote() {
|
|
System.out.println("\nAusgabe der Daten in Klasse Noten:");
|
|
System.out.println("Student (Matrikelnummer): " + mNr);
|
|
System.out.println("Fach: " + fach);
|
|
System.out.println("Note: " + note);
|
|
}
|
|
}
|
|
11.3 Klasse Stud |
|
Die Klasse Stud enthält neben den Attributen mNr (Matrikelnummer), name (Name), vName (Vorname), gebTag (Geburtstag) und anzSem (erreichtes Semester) das Klassenattribut anzStud (Anzahl Studierende). Diese wird bei der Einrichtung auf einen Anfangswert gesetzt. |
|
Die hier gewählte Konstruktorvariante zeigt die Erstellung eines Objekts mit Hilfe der Parameterliste. Wie der zugehörige Aufruf aussieht, zeigt die Klasse HP. Die Einträge der im Aufruf übergebenen Werte erfolgt mit Hilfe des Key Words this. Außerdem wird hier wiederum gleich beim Konstruktor das Attribut anzStud um 1 hochgezählt. |
|
Die Klasse hat außerdem die Methode ausgeben(), mit der die Daten des gerade erstellten Objekts auf der Konsole angezeigt werden. |
|
Klasse Stud mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public String mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
Oben: Instanzenattribute zur Beschreibung der Objekte. |
|
|
|
static int anzStud = 0;
|
|
Klassenattribut (statisches Attribut) mit Anfangswert: |
|
|
|
public Stud (String mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
anzStud++; //Zähler für Klassenattribut
|
|
}
|
|
Konstruktor mit Parameterliste. Zu beachten ist das Eintragen der Parameterwerte mittel this in die Attribute. |
|
Der Aufruf im HP ist hier wie folgt: Stud s0 = new Stud("1111", "Maier", "Klara", 5, "21.09.2002"). |
|
Das Klassenattribut anzStud() wird bei jedem Konstruktoraufruf um 1 erhöht. |
|
|
|
void ausgeben() {
|
|
System.out.println("\nMatrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Methode zum Ausgeben der Daten eines Objekts. Der Aufruf im HP ist z.B. wie folgt: s1.ausgeben(); |
|
}
|
|
Klasse Stud ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public String mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
static int anzStud = 0;
|
|
public Stud (String mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr =mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
anzStud++;
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("\nMatrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
}
|
|
11.4 Programmlauf |
|
Ausgabe der Daten in HP mit Methode der Klasse Stud:
|
|
|
|
Matrikelnummer: 123
|
|
Name: Maier
|
|
Vorname:Klara
|
|
Erreichtes Semester: 5
|
|
Geburtstag: 21.09.2002
|
|
|
|
Matrikelnummer: 234
|
|
Name: Müller
|
|
Vorname:Ulla
|
|
Erreichtes Semester: 5
|
|
Geburtstag: 1.1.1999
|
|
|
|
Ausgabe der Daten in Klasse Noten:
|
|
|
|
Student (Matrikelnummer): 234
|
|
Fach: EinfWI
|
|
Note: 2
|
|
|
|
Ausgabe der Noten in Klasse HP:
|
|
|
|
Matrikelnummer: 234
|
|
Name: Müller
|
|
Vorname: Ulla
|
|
Fach: EinfWI
|
|
Note: 2
|
|
12 Projekt HS5 |
|
Hier werden mit java.util.Scanner Konsoleneingaben (Integerwerte und Strings) gelesen. Vgl. Abschnitt 3.1. Dann wird ein Objekt erzeugt und mit den eingelesenen Daten bespielt. Mithilfe der Instanzmethode ausgeben() aus Stud.java wird dann dieses Objekt auf dem Bildschirm angezeigt. Abschließend wird das Hochzählen einer Klassenvariablen demonstriert. |
|
Zusammengefasst: |
|
- Konsoleneingaben mit java.utilScanner
- Klassenattribut
- Konstruktor mit Klassenattribut
- Instanzmethode
|
|
|
|
12.1 Klasse HP |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.util.Scanner;
|
|
Oben: Importieren der Klasse für das Einlesen von der Konsole mit den Methoden nextLine() und nextInt(). |
|
|
|
public class HS5 {
|
|
public static void main(String[] args) {
|
|
System.out.println("Objekt eingeben (j/n): ");
|
|
String s = new java.util.Scanner(System.in).nextLine();
|
|
Frage und Antwort von der Konsole. Ein "Objekt" der Scanner-Klasse wird instanziiert, die Methode nextLine() wird ausgeführt und das Ergebnis in den String s geschrieben. |
|
|
|
switch(s) {
|
|
Klassisches Switch-Programmierkonstrukt (für Verzweigungen). |
|
|
|
case "j":
|
|
Falls oben "j" eingegeben wurde, wird dieser Block bearbeitet. |
|
|
|
System.out.println("Eingabe:");
|
|
System.out.print("Matrikelnummer: ");
|
|
int mNr = new java.util.Scanner(System.in).nextInt();
|
|
Das Einlesen eines Integer-Werts erfolgt mit der Methode nextInt(). |
|
|
|
System.out.print("Name: ");
|
|
String name = new java.util.Scanner(System.in).nextLine();
|
|
Das Einlesen einer Zeile mit einer Zeichenkette erfolgt mit der Methode nextLine(). |
|
|
|
System.out.print("Vorname: ");
|
|
String vName = new java.util.Scanner(System.in).nextLine();
|
|
|
|
System.out.print("Aktuelles Semester: ");
|
|
java.util.Scanner scanner = new java.util.Scanner(System.in);
|
|
int anzSem = scanner.nextInt();
|
|
Der Befehl String vName = new java.util.Scanner(System.in).nextLine() erzeugt in Eclipse eine Warnung ("unassigned closeable value"). Die Aufspaltung wie hier oben vermeidet diese Fehlermeldung. Dabei werden das Einlesen und das Zuweisen in das Attribut getrennt. |
|
|
|
System.out.print("Geburtstag: ");
|
|
String gebTag = new java.util.Scanner(System.in).nextLine();
|
|
|
|
Stud s100 = new Stud();//neues Objekt erzeugen
|
|
s100.mNr = mNr;
|
|
s100.name = name;
|
|
s100.vName = vName;
|
|
s100.anzSem = anzSem;
|
|
s100.gebTag = gebTag;
|
|
Anlegen des Objekts s100 und Bespielen mit den von der Konsole eingelesenen Werten. |
|
|
|
System.out.println("\n-----Objekt mit externer Methode anzeigen:");
|
|
System.out.println("");
|
|
|
|
s100.ausgeben();
|
|
Anzeigen der Werte von s100 mit der Instanzmethode ausgeben() aus der Klasse Stud. |
|
|
|
break;
|
|
default: System.out.println("Abbruch");
|
|
Falls zu Beginn nicht "j" eingegeben wurde. |
|
|
|
break;
|
|
Jede Verzweigung mit case braucht am Schluss diesen Befehl; |
|
}
|
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.util.Scanner;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
System.out.println("Objekt eingeben (j/n): ");
|
|
String s = new java.util.Scanner(System.in).nextLine();
|
|
|
|
switch(s) {
|
|
case "j":
|
|
System.out.println("Eingabe:");
|
|
|
|
System.out.print("Matrikelnummer: ");
|
|
int mNr = new java.util.Scanner(System.in).nextInt();//Integer!
|
|
|
|
System.out.print("Name: ");
|
|
String name = new java.util.Scanner(System.in).nextLine();//String!
|
|
|
|
System.out.print("Vorname: ");
|
|
String vName = new java.util.Scanner(System.in).nextLine();
|
|
|
|
System.out.print("Aktuelles Semester: ");
|
|
//Alternative, damit erfolgt keine Warnung
|
|
java.util.Scanner scanner = new java.util.Scanner(System.in);
|
|
int anzSem = scanner.nextInt();
|
|
|
|
System.out.print("Geburtstag: ");
|
|
String gebTag = new java.util.Scanner(System.in).nextLine();
|
|
|
|
Stud s100 = new Stud();//neues Objekt erzeugen
|
|
s100.mNr = mNr;
|
|
s100.name = name;
|
|
s100.vName = vName;
|
|
s100.anzSem = anzSem;
|
|
s100.gebTag = gebTag;
|
|
|
|
System.out.println("\n-----Objekt mit externer Methode anzeigen:");
|
|
System.out.println("");
|
|
|
|
s100.ausgeben();//Methode von Klasse Stud
|
|
System.out.println("\n");
|
|
break;
|
|
default: System.out.println("Abbruch");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
12.2 Klasse Stud |
|
Klasse Stud mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
|
|
static int anzStud = 0;
|
|
Oben: Klassenattribut/statisches Attribut anzStud mit Anfangswert. |
|
|
|
public Stud () {
|
|
anzStud++; //Zähler für Klassenattribut
|
|
}
|
|
Konstruktor mit Klassenattribut als Zähler. Bei jedem Aufruf wird er um 1 höher gesetzt. |
|
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Methode zum Ausgeben der Daten eines Objekts. |
|
}
|
|
Klasse Stud ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class Stud {
|
|
public int mNr; //Matrikelnummer
|
|
public String name;
|
|
public String vName;
|
|
public int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
static int anzStud = 0;
|
|
public Stud () {
|
|
anzStud++; //Zähler für Klassenattribut
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("Matrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
}
|
|
12.3 Beispielhafter Programmlauf |
|
Objekt eingeben (j/n):
|
|
j
|
|
Eingabe:
|
|
Matrikelnummer: 12345
|
|
Name: Studer
|
|
Vorname: Guiseppe
|
|
Aktuelles Semester: 8
|
|
Geburtstag: 21.9.2000
|
|
|
|
-----Objekt mit externer Methode anzeigen:
|
|
|
|
Matrikelnummer: 12345
|
|
Name: Studer
|
|
Vorname:Guiseppe
|
|
Erreichtes Semester: 8
|
|
Geburtstag: 21.9.2000
|
|
Der Programmlauf zeigt, dass die Dateneingabe mit java.util.Scanner recht schlicht ist. Deshalb werden hier in den weiteren Programmen noch andere Vorgehensweisen demonstriert. |
|
13 Projekt HS6 |
|
Hier geht es um Record-Klassen. Vgl. deren Beschreibung in Abschnitt 4.7. |
|
|
|
13.1 Klasse HP |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
Stud s1 = new Stud("Müller", "Franz", 88888, "Überall", 5, "20.1.2000");
|
|
Stud s2 = new Stud("Müller", "Franz", 99999, "Nirgendwo", 13, "1.1.2001");
|
|
Stud s3 = new Stud("Müller", "Franz", 99999, "Nirgendwo", 13, "1.1.2001");
|
|
Oben: Drei records werden erzeugt. Auch hier wird mit new der Konstruktur angeworfen. Vgl. Record Stud unten. Die records werden per Parameterübergabe beschrieben. |
|
|
|
System.out.println("\nAusgabe einzelner Attributsausprägungen:\n");
|
|
System.out.println("Name: " + s1.name());
|
|
System.out.println("Name: " + s2.name());
|
|
Für jedes Attribut wird eine gleichnamige Abfragemethode bereitgestellt. Für name also name(), wie hier gezeigt. |
|
|
|
System.out.println("\nAusgabe records s1 ... s3:\n");
|
|
System.out.println(s1.toString());
|
|
System.out.println(s2.toString());
|
|
System.out.println(s3.toString());
|
|
Die Methode toString() liefert Ausgaben eines ganzen Record-Objekts mit Attributsbezeichnung und Attributsausprägung. Vgl. unten. |
|
|
|
System.out.println("\nVergleich der Objekte:\n");
|
|
if (s1.equals(s2))
|
|
System.out.println("s1 und s2: Identische Studierende.");
|
|
else
|
|
System.out.println("s1 und s2: Nicht identische Studierende.");
|
|
if (s3.equals(s2))
|
|
System.out.println("s3 und s2: Identische Studierende.");
|
|
else
|
|
System.out.println("s3 und s2: Nicht identische Studierende.");
|
|
if (s3.equals(s1))
|
|
System.out.println("s3 und s1: Identische Studierende.");
|
|
else
|
|
System.out.println("s3 und s1: Nicht identische Studierende.");
|
|
Der Vergleich von Record-Objekten erfolgt mit der Methode equals(). Eine Abfrage mittels einfacher Gleichsetzung klappt nicht. Vgl. die in Abschnitt 4.7 angegebene Literatur. |
|
|
|
System.out.println("\nStudierende/r s1:");
|
|
s1.ausgeben();
|
|
System.out.println("\nStudierende/r s2:");
|
|
s2.ausgeben();
|
|
System.out.println("\nStudierende/r s3:");
|
|
s3.ausgeben();
|
|
Zur Veranschaulichung hier noch die "klassische" Ausgabe auf der Konsole. |
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
Stud s1 = new Stud("Studer", "Maria", 88888, "Überall", 5, "20.1.2000");
|
|
Stud s2 = new Stud("Boller", "Rudi", 99999, "Nirgendwo", 13, "1.1.2001");
|
|
Stud s3 = new Stud("Boller", "Rudi", 99999, "Nirgendwo", 13, "1.1.2001");
|
|
|
|
System.out.println("\nAusgabe einzelner Attributsausprägungen:\n");
|
|
System.out.println("Name: " + s1.name());
|
|
System.out.println("Name: " + s2.name());
|
|
|
|
System.out.println("\nAusgabe records s1 ... s3:\n");
|
|
System.out.println(s1.toString());
|
|
System.out.println(s2.toString());
|
|
System.out.println(s3.toString());
|
|
|
|
System.out.println("\nVergleich der Objekte:\n");
|
|
|
|
if (s1.equals(s2))
|
|
System.out.println("s1 und s2: Identische Studierende.");
|
|
else
|
|
System.out.println("s1 und s2: Nicht identische Studierende.");
|
|
|
|
if (s3.equals(s2))
|
|
System.out.println("s3 und s2: Identische Studierende.");
|
|
else
|
|
System.out.println("s3 und s2: Nicht identische Studierende.");
|
|
if (s3.equals(s1))
|
|
System.out.println("s3 und s1: Identische Studierende.");
|
|
else
|
|
System.out.println("s3 und s1: Nicht identische Studierende.");
|
|
|
|
System.out.println("\nStudierende/r s1:");
|
|
s1.ausgeben();
|
|
System.out.println("\nStudierende/r s2:");
|
|
s2.ausgeben();
|
|
System.out.println("\nStudierende/r s3:");
|
|
s3.ausgeben();
|
|
}
|
|
}
|
|
13.2 Klasse Stud |
|
package hochschule;
|
|
|
|
public record Stud (String name, String vName, int plz, String ort, int anzSem, String gebTag) {
|
|
Aufruf des Konstruktors. Damit wird der Record eingerichtet. |
|
|
|
void ausgeben() {
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("PLZ: " + plz);
|
|
System.out.println("Ort: " + ort);
|
|
System.out.println("Anzahl Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
}
|
|
13.3 Programmlauf |
|
Ausgabe records s1 ... s3:
|
|
|
|
Stud[name=Studer, vName=Maria, plz=88888, ort=Überall, anzSem=5, gebTag=20.1.2000]
|
|
Stud[name=Boller, vName=Rudi, plz=99999, ort=Nirgendwo, anzSem=13, gebTag=1.1.2001]
|
|
Stud[name=Boller, vName=Rudi, plz=99999, ort=Nirgendwo, anzSem=13, gebTag=1.1.2001]
|
|
|
|
Vergleich der Objekte:
|
|
|
|
s1 und s2: Nicht identische Studierende.
|
|
s3 und s2: Identische Studierende.
|
|
s3 und s1: Nicht identische Studierende.
|
|
|
|
Studierende/r s1:
|
|
Name: Studer
|
|
Vorname:Maria
|
|
PLZ: 88888
|
|
Ort: Überall
|
|
Anzahl Semester: 5
|
|
Geburtstag: 20.1.2000
|
|
|
|
Studierende/r s2:
|
|
Name: Boller
|
|
Vorname:Rudi
|
|
PLZ: 99999
|
|
Ort: Nirgendwo
|
|
Anzahl Semester: 13
|
|
Geburtstag: 1.1.2001
|
|
|
|
Studierende/r s3:
|
|
Name: Boller
|
|
Vorname:Rudi
|
|
PLZ: 99999
|
|
Ort: Nirgendwo
|
|
Anzahl Semester: 13
|
|
Geburtstag: 1.1.2001
|
|
14 Projekt HS7 - Vererbung, Attribute |
|
Hier wird an einem einfachen Beispiel die Umsetzung des Vererbungskonzepts in Java gezeigt. Dies erfolgt anhand des folgenden Auschnitts aus der Vererbungshierarchie von Abbildung 6.5-1 aus [Staud 2025] und anhand von Attributen. |
|
Die Superklasse ist Fahrzeuge, zwei Subklassen davon sind PKW und LKW, eine weitere Subklasse, jetzt aber von PKW, ist VAN. Attribute sind unten in den Programmen angegeben. |
|

|
|
Abbildung 13.3-1: Generalisierung / Spezialisierung mit Vererbung. Quelle: Auszug aus [Staud 2025, Abbildung 13.3-2] |
|
Darstellung |
|
Bei diesem Projekt betrachten wir zuerst die Klassen der Generalisierung / Spezialisierung mit ihrer Vererbungshierarchie, dann das HP (Hauptprogramm). Auch hier werden die Beispiele ganz einfach gehalten und auf die aktuelle Fragestellung zugeschnitten. |
|
|
|
14.1 Klasse Fahrzeuge |
|
Klasse Fahrzeuge mit Erläuterungen |
|
package fahrzeuge;
|
|
|
|
import javax.swing.JOptionPane;
|
|
Oben: Für die grafische Eingabe von Marktpreis und Preiserhöhung. |
|
|
|
public class Fahrzeuge {
|
|
int fzNr = 0;
|
|
float listenPreis = 0.0F;
|
|
private float marktPreis =0.0f;
|
|
Eingeschränkte Sichtbarkeit |
|
|
|
String hersteller;
|
|
String bez;
|
|
int baujahr;
|
|
String datumZul ;
|
|
double gewicht;
|
|
char antrieb ='n'; //D iesel, B enz8in, E lektro, H ybrid
|
|
int kw; //Nennleistung
|
|
String getriebe;
|
|
|
|
void marktPreis() {
|
|
System.out.println("Derzeitiger Marktpreis vor EINTRAGEN: " + marktPreis);
|
|
}
|
|
Der Marktpreis des jeweiligen Objekts kann von den anderen Klassen wegen Sichtbarkeit private nicht direkt abgefragt werden. Deshalb obige Methode. Diese wird dann von HP aufgerufen. |
|
|
|
void marktPreisEintragen(float marktPreis) {
|
|
this.marktPreis = marktPreis;
|
|
System.out.println("Derzeitiger Marktpreis nach EINTRAGEN: " + marktPreis);
|
|
}
|
|
Eintragen in private marktPreis mittels sichtbarer Methode. |
|
}
|
|
Klasse Fahrzeuge ohne Erläuterungen |
|
package fahrzeuge;
|
|
|
|
import javax.swing.JOptionPane;
|
|
public class Fahrzeuge {
|
|
int fzNr = 0;
|
|
float listenPreis = 0.0F;
|
|
private float marktPreis =0.0f;
|
|
String hersteller;
|
|
String bez;
|
|
int baujahr;
|
|
String datumZul ;
|
|
double gewicht;
|
|
char antrieb ='n'; //D iesel, B enz8in, E lektro, H ybrid
|
|
int kw; //Nennleistung
|
|
String getriebe;
|
|
|
|
void marktPreis() {
|
|
System.out.println("Derzeitiger Marktpreis vor EINTRAGEN: " + marktPreis);
|
|
}
|
|
void marktPreisEintragen(float marktPreis) {
|
|
this.marktPreis = marktPreis;
|
|
System.out.println("Derzeitiger Marktpreis nach EINTRAGEN: " + marktPreis);
|
|
}
|
|
}
|
|
14.2 Klasse PKW |
|
package fahrzeuge;
|
|
|
|
public class PKW extends Fahrzeuge {
|
|
String garantie = "nicht erfaßt";
|
|
String typ; //L imousine, K ombi, ...
|
|
int autonomStufe;//1 mit Fahrer, ..., 5: autonom
|
|
}
|
|
Diese Subklasse von Fahrzeuge enthält Attribute, die spezifisch sind für PKW oder die im jeweiligen Kontext nur für PKW erhoben werden sollen. |
|
14.3 Klasse LKW |
|
Klasse LKW mit Erläuterungen |
|
public class LKW extends Fahrzeuge {
|
|
double ladeKap; //Ladekapazität
|
|
int zahlAchsen;
|
|
String zustand = "---";
|
|
Spezifische Attribute für LKW. Erbt alle Attribute und Methoden von Fahrzeuge. |
|
|
|
public LKW (int fzNr, float listenPreis, String hersteller, String bez, int baujahr, String datumZul, double gewicht, char antrieb, int kw, String getriebe, double ladeKap, int zahlAchsen, String zustand) {
|
|
this.fzNr = fzNr;
|
|
this.listenPreis = listenPreis;
|
|
this.hersteller = hersteller;
|
|
this.bez = bez;
|
|
this.baujahr = baujahr;
|
|
this.datumZul = datumZul;
|
|
this.gewicht = gewicht;
|
|
this.antrieb = antrieb;
|
|
this.kw = kw;
|
|
this.getriebe = getriebe;
|
|
this.ladeKap = ladeKap;
|
|
this.zahlAchsen = zahlAchsen;
|
|
this.zustand = zustand;
|
|
}
|
|
Konstruktor mit Datenübergabe per Parameter. Aufruf siehe HP. |
|
|
|
public LKW() {
|
|
}
|
|
Standardkonstruktor. Ist voreingestellt da und muss normalerweise nicht angegeben werden. Hier aber notwendig, weil oben ein spezifischer Konstruktor angegeben wurde. |
|
}
|
|
Diese Subklasse von Fahrzeuge enthält Attribute, die spezifisch sind für LKW oder die im jeweiligen Kontext nur für LKW erhoben werden sollen. |
|
Klasse LKW ohne Erläuterungen |
|
public class LKW extends Fahrzeuge {
|
|
double ladeKap; //Ladekapazität
|
|
int zahlAchsen;
|
|
String zustand = "---";
|
|
public LKW (int fzNr, float listenPreis, String hersteller, String bez, int baujahr, String datumZul, double gewicht, char antrieb, int kw, String getriebe, double ladeKap, int zahlAchsen, String zustand) {
|
|
this.fzNr = fzNr;
|
|
this.listenPreis = listenPreis;
|
|
this.hersteller = hersteller;
|
|
this.bez = bez;
|
|
this.baujahr = baujahr;
|
|
this.datumZul = datumZul;
|
|
this.gewicht = gewicht;
|
|
this.antrieb = antrieb;
|
|
this.kw = kw;
|
|
this.getriebe = getriebe;
|
|
this.ladeKap = ladeKap;
|
|
this.zahlAchsen = zahlAchsen;
|
|
this.zustand = zustand;
|
|
}
|
|
public LKW() {
|
|
}
|
|
}
|
|
14.4 Klasse Van |
|
Subklasse von PKW. Sie kann also die Attribute und Methoden von PKW und von Fahrzeuge erben. Sie enthält Attribute, die spezifisch sind für VANs oder die im jeweiligen Kontext nur für VAN erhoben werden sollen. |
|
Klasse VAN mit Erläuterungen |
|
package fahrzeuge;
|
|
|
|
public class VAN extends PKW {
|
|
int maxPers = 0;
|
|
boolean bank = false;
|
|
|
|
public VAN (int maxPers, boolean bank) {
|
|
this.maxPers = maxPers;
|
|
this.bank = bank;
|
|
}
|
|
Oben: Konstruktor mit Übergabe der Werte beim Aufruf. |
|
|
|
void ausgeben() {
|
|
System.out.println("Inventarnummer: " + fzNr);
|
|
System.out.println("Hersteller: " + hersteller);
|
|
System.out.println("Bezeichnung: " + bez);
|
|
System.out.println("Baujahr: " + baujahr);
|
|
System.out.println("Datum der Erstzulassung: " + datumZul);
|
|
System.out.println("Antriebsart: " + antrieb);
|
|
System.out.println("Listenpreis: " + listenPreis);
|
|
Alle obigen Attribute geerbt von Fahrzeuge |
|
|
|
//System.out.println("Marktpreis: " + marktPreis);
|
|
Oben: Geht nicht, wegen Sichtbarkeit private. |
|
|
|
System.out.println("Gewicht: " + gewicht);
|
|
System.out.println("Nennleistung: " + kw);
|
|
System.out.println("Getriebe: " + getriebe);
|
|
Obige drei Attribute stammen wiederum von Fahrzeuge |
|
|
|
System.out.println("Garantie: " + garantie);
|
|
System.out.println("Typ:" + typ);
|
|
System.out.println("Automatisches Fahren, Stufe: " + autonomStufe);
|
|
Obige drei Attribute stammen von der Klasse PKW. |
|
|
|
System.out.println("Maximal Anzahl Personen: " + maxPers);
|
|
System.out.println("Bank: " + bank);
|
|
Obige zwei Attribute stammen von dieser Klasse. |
|
}
|
|
}
|
|
Klasse VAN ohne Erläuterungen |
|
package fahrzeuge;
|
|
|
|
public class VAN extends PKW {
|
|
int maxPers = 0;
|
|
boolean bank = false;
|
|
|
|
public VAN (int maxPers, boolean bank) {
|
|
this.maxPers = maxPers;
|
|
this.bank = bank;
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("Inventarnummer: " + fzNr);
|
|
System.out.println("Hersteller: " + hersteller);
|
|
System.out.println("Bezeichnung: " + bez);
|
|
System.out.println("Baujahr: " + baujahr);
|
|
System.out.println("Datum der Erstzulassung: " + datumZul);
|
|
System.out.println("Antriebsart: " + antrieb);
|
|
System.out.println("Listenpreis: " + listenPreis);
|
|
//System.out.println("Marktpreis: " + marktPreis); GEHT NICHT
|
|
System.out.println("Gewicht: " + gewicht);
|
|
System.out.println("Nennleistung: " + kw);
|
|
System.out.println("Getriebe: " + getriebe);
|
|
System.out.println("Garantie: " + garantie);
|
|
System.out.println("Typ:" + typ);
|
|
System.out.println("Automatisches Fahren, Stufe: " + autonomStufe);
|
|
System.out.println("Maximal Anzahl Personen: " + maxPers);
|
|
System.out.println("Bank: " + bank);
|
|
}
|
|
}
|
|
14.5 Klasse HP |
|
Im Hauptprogramm (Klasse HP) wird die Nutzung des Vererbungsmechanismus demonstriert. Zuerst mit Hilfe des Konstruktors von VAN, dessen Objekte von zwei übergeordneten Klassen die Attribute übernehmen. Dann mit der Klasse LKW, die von der Superklasse erbt. Abschließend wird ein Objekt von Fahrzeuge instantiiert, das von keiner anderen Klasse erbt. Außerdem sind mehrere Methodenaufrufe entlang der Vererbungsbeziehungen eingefügt. |
|
Klasse HP mit Erläuterungen |
|
package fahrzeuge;
|
|
|
|
public class HP {
|
|
|
|
public static void main(String[] args) {
|
|
VAN pkw1 = new VAN(1, false);
|
|
Oben: Konstruktor von VAN mit Übergabe der Attributsausprägungen in der Parameterliste. Es entsteht ein Objekt pkw1, das zusätzlich zu den Attributen von VAN die von PKW und Fahrzeuge aufweist. Alle diese Attribute werden im folgenden beschrieben und angezeigt. |
|
|
|
String eingabe;
|
|
System.out.println("\nKonstruktor mit Klasse VAN");
|
|
System.out.println("(geerbt wird von PKW und Fahrzeuge):");
|
|
System.out.println();
|
|
Plattformunabhängige Anforderung eines Zeilenvorschubs. |
|
|
|
System.out.println("Ausgabe des Objekts der Klasse VAN im HP " + "\nOHNE DATEN mit Methode aus VAN:\n");
|
|
pkw1.ausgeben();
|
|
Diese Methode ist in der Klasse VAN definiert, kann aber von HP aus aufgerufen werden. |
|
|
|
System.out.println("\nBeschreiben aller Attribute des Objekts der Klasse VAN im HP\n");
|
|
Alle Attribute von pkw1 werden im HP beschrieben. |
|
|
|
pkw1.fzNr =1007;
|
|
pkw1.listenPreis=50000;
|
|
|
|
//pkw1.marktPreis = 40000;
|
|
Das geht nicht, wegen Sichtbarkeit "private" |
|
|
|
pkw1.hersteller="Audi";
|
|
pkw1.bez = "Touran";
|
|
pkw1.baujahr = 2020;
|
|
pkw1.datumZul = "1.1.2018";
|
|
pkw1.gewicht =3.5D;
|
|
pkw1.antrieb = 'd';
|
|
pkw1.datumZul ="1.1.2020";
|
|
pkw1.kw = 150;
|
|
pkw1.getriebe = "Automatik";
|
|
Obige stammen von der Klasse Fahrzeuge. |
|
|
|
pkw1.garantie = " 3 Jahre";
|
|
pkw1.typ="L";
|
|
pkw1.autonomStufe=1;
|
|
Diese von PKW. |
|
|
|
pkw1.maxPers = 10;
|
|
pkw1.bank = true;
|
|
Die letzten zwei von VAN. |
|
|
|
System.out.println("\n===========Ausgabe des Objekts der Klasse VAN im HP " + "\nMIT DATEN und der Methode aus VAN:\n");
|
|
pkw1.ausgeben();
|
|
Diese Methode ist in Klasse VAN definiert. |
|
|
|
//-------------------------------------------
|
|
System.out.println("\n==========Private Methoden in Fahrzeuge aufrufen:==========/n");
|
|
pkw1.marktPreis();
|
|
Die Methode marktPreis() von Fahrzeuge gibt den aktuellen Marktpreis aus. Das Attribut marktPreis hat die Sichtbarkeit private und kann deshalb nicht direkt abgefragt werden. |
|
|
|
System.out.println("Marktpreis festlegen");
|
|
eingabe = JOptionPane.showInputDialog("Neuer Marktpreis: ");
|
|
int marktPreis = Integer.parseInt(eingabe);
|
|
pkw1.marktPreisEintragen(marktPreis);
|
|
Die Methode marktPreisEintragen() von Fahrzeuge beschreibt das Attribut marktPreis von Fahrzeuge. Direkt geht nicht, wegen Sichtbarkeit private. |
|
|
|
//-------------------------------------------
|
|
System.out.println("\n=====Methodeneinsatz für Preiserhöhung=====");
|
|
System.out.println("Bisheriger Preis:" + pkw1.listenPreis);
|
|
eingabe = JOptionPane.showInputDialog("Gewünschte Preiserhöhung: ");
|
|
int erhPreis = Integer.parseInt(eingabe);
|
|
|
|
System.out.println("Alter Preis: " + pkw1.listenPreis);
|
|
System.out.println("Gewünschte Erhöhung: " + erhPreis + "%");
|
|
|
|
pkw1.listenPreis = (pkw1.listenPreis/100) * (100 + erhPreis);
|
|
System.out.println("Neuer Preis: " + pkw1.listenPreis);
|
|
Obiges zeigt, wie problemlos Instanzattribute mit Sichtbarkeit paketsichtbar bearbeitet werden können. Hier erfolgt von HP aus der Zugriff auf Attribute der Klasse Fahrzeuge. |
|
|
|
System.out.println("\n==========Konstruktor von Klasse LKW==========");
|
|
System.out.println("(geerbt wird nur von Fahrzeuge):\n");
|
|
LKW lkw1 = new LKW();
|
|
Objekt lkw1 der Klasse LKW wird erzeugt. |
|
|
|
System.out.println("Daten von Objekt LKW1: \n");
|
|
lkw1.fzNr = 123456;
|
|
System.out.println("Fahrzeugnummer: " + lkw1.fzNr);
|
|
lkw1.listenPreis = 150299.90F;
|
|
System.out.println("Listenpreis: " + lkw1.listenPreis);
|
|
lkw1.antrieb='d';
|
|
if (lkw1.antrieb == 'd')
|
|
System.out.println("Antrieb: Diesel");
|
|
else if (lkw1.antrieb == 'b')
|
|
System.out.println("Antrieb: Benzin");
|
|
else if (lkw1.antrieb == 'e')
|
|
System.out.println("Antrieb: Hybrid");
|
|
else
|
|
System.out.println("Antrieb: unbekannt");
|
|
lkw1.datumZul ="1.1.2010";
|
|
System.out.println("Datum Erstzulassung: " + lkw1.datumZul);
|
|
lkw1.gewicht =7.5D;
|
|
System.out.println("Gewicht: " + lkw1.gewicht);
|
|
lkw1.ladeKap=40.5;
|
|
System.out.println("Ladekapazität: " + lkw1.ladeKap);
|
|
lkw1.zahlAchsen = 6;
|
|
System.out.println("Anzahl Achsen: " + lkw1.zahlAchsen);
|
|
lkw1.zustand = "Schlecht";
|
|
System.out.println("Zustand des LKW: " + lkw1.zustand);
|
|
//lkw1.garantie = ... GEHT NICHT, ist nicht "sichtbar"
|
|
Oben: Objekt beschreiben und Daten ausgeben. |
|
|
|
LKW lkw2 = new LKW(12345, 50000.60F, "BMW", "xyzhybrid", 2022, "1.1.2022", 1500, 'H', 240, "Automatik", 40.5, 4, "Toll");
|
|
Neues Objekt lkw2 durch Datenübergabe an Konstruktor. |
|
|
|
System.out.println("\nDaten von Objekt LKW2: \n");
|
|
|
|
System.out.println("Fahrzeugnummer: " + lkw2.fzNr);
|
|
System.out.println("Listenpreis2: " + lkw2.listenPreis);
|
|
System.out.println("Antrieb: " + lkw2.antrieb);
|
|
System.out.println("Datum Erstzulassung: " + lkw2.datumZul);
|
|
System.out.println("Gewicht: " + lkw2.gewicht);
|
|
System.out.println("Ladekapazität: " + lkw2.ladeKap);
|
|
System.out.println("Anzahl Achsen: " + lkw2.zahlAchsen);
|
|
System.out.println("Zustand des LKW: " + lkw2.zustand);
|
|
|
|
//-----------------------------------------------------
|
|
|
|
System.out.println("\n==========Konstruktor von Klasse Fahrzeuge==========");
|
|
System.out.println("(nichts wird geerbt):\n");
|
|
|
|
Fahrzeuge fz1 = new Fahrzeuge();
|
|
fz1.datumZul ="1.1.2016";
|
|
System.out.println("Zulassung: " + fz1.datumZul);
|
|
fz1.fzNr = 12345;
|
|
System.out.println("Fahrzeugnummer: " + fz1.fzNr);
|
|
fz1.antrieb='b';
|
|
System.out.println("Antrieb: " + fz1.antrieb);
|
|
fz1.listenPreis = 120900.00F;
|
|
System.out.println("Preis: " + fz1.listenPreis);
|
|
fz1.gewicht =2.0D;
|
|
System.out.println("Gewicht: " + fz1.gewicht);
|
|
fz1.kw =140;
|
|
System.out.println("Motorleistung (kw): " + fz1.kw);
|
|
fz1.getriebe ="Schalter";
|
|
System.out.println("Getriebe: " + fz1.getriebe);
|
|
// Das klappt nicht: fz1.baujahr = 2000;
|
|
Der Konstruktor von Fahrzeuge erzeugt ein Objekt ohne die Attribute und Methoden der Subklassen. |
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package fahrzeuge;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
VAN pkw1 = new VAN(1, false);
|
|
String eingabe;
|
|
System.out.println("\nKonstruktor mit Klasse VAN");
|
|
System.out.println("(geerbt wird von PKW und Fahrzeuge):");
|
|
System.out.println();
|
|
System.out.println("Ausgabe des Objekts der Klasse VAN im HP " + "\nOHNE DATEN mit Methode aus VAN:\n");
|
|
pkw1.ausgeben();
|
|
System.out.println("\nBeschreiben aller Attribute des Objekts der Klasse VAN im HP\n");
|
|
pkw1.fzNr =1007;
|
|
pkw1.listenPreis=50000;
|
|
//pkw1.marktPreis = 40000;
|
|
pkw1.hersteller="Audi";
|
|
pkw1.bez = "Touran";
|
|
pkw1.baujahr = 2020;
|
|
pkw1.datumZul = "1.1.2018";
|
|
pkw1.gewicht =3.5D;
|
|
pkw1.antrieb = 'd';
|
|
pkw1.datumZul ="1.1.2020";
|
|
pkw1.kw = 150;
|
|
pkw1.getriebe = "Automatik";
|
|
pkw1.garantie = " 3 Jahre";
|
|
pkw1.typ="L";
|
|
pkw1.autonomStufe=1;
|
|
pkw1.maxPers = 10;
|
|
pkw1.bank = true;
|
|
System.out.println("\n===========Ausgabe des Objekts der Klasse VAN im HP " + "\nMIT DATEN und der Methode aus VAN:\n");
|
|
pkw1.ausgeben();
|
|
//-------------------------------------------
|
|
System.out.println("\n==========Private Methoden in Fahrzeuge aufrufen:==========/n");
|
|
pkw1.marktPreis();//Methode von Fahrzeuge, verändert nicht sichtbares Attribut von Fahrzeuge
|
|
System.out.println("Marktpreis festlegen");
|
|
eingabe = JOptionPane.showInputDialog("Neuer Marktpreis: ");
|
|
int marktPreis = Integer.parseInt(eingabe);
|
|
pkw1.marktPreisEintragen(marktPreis);
|
|
//-------------------------------------------
|
|
System.out.println("\n=====Methodeneinsatz für Preiserhöhung=====");
|
|
System.out.println("Bisheriger Preis:" + pkw1.listenPreis);
|
|
eingabe = JOptionPane.showInputDialog("Gewünschte Preiserhöhung: ");
|
|
int erhPreis = Integer.parseInt(eingabe);
|
|
|
|
System.out.println("Alter Preis: " + pkw1.listenPreis);
|
|
System.out.println("Gewünschte Erhöhung: " + erhPreis + "%");
|
|
|
|
pkw1.listenPreis = (pkw1.listenPreis/100) * (100 + erhPreis);
|
|
System.out.println("Neuer Preis: " + pkw1.listenPreis);
|
|
System.out.println("\n==========Konstruktor von Klasse LKW==========");
|
|
System.out.println("(geerbt wird nur von Fahrzeuge):\n");
|
|
LKW lkw1 = new LKW();
|
|
System.out.println("Daten von Objekt LKW1: \n");
|
|
lkw1.fzNr = 123456;
|
|
System.out.println("Fahrzeugnummer: " + lkw1.fzNr);
|
|
lkw1.listenPreis = 150299.90F;
|
|
System.out.println("Listenpreis: " + lkw1.listenPreis);
|
|
lkw1.antrieb='d';
|
|
if (lkw1.antrieb == 'd')
|
|
System.out.println("Antrieb: Diesel");
|
|
else if (lkw1.antrieb == 'b')
|
|
System.out.println("Antrieb: Benzin");
|
|
else if (lkw1.antrieb == 'e')
|
|
System.out.println("Antrieb: Hybrid");
|
|
else
|
|
System.out.println("Antrieb: unbekannt");
|
|
lkw1.datumZul ="1.1.2010";
|
|
System.out.println("Datum Erstzulassung: " + lkw1.datumZul);
|
|
lkw1.gewicht =7.5D;
|
|
System.out.println("Gewicht: " + lkw1.gewicht);
|
|
lkw1.ladeKap=40.5;
|
|
System.out.println("Ladekapazität: " + lkw1.ladeKap);
|
|
lkw1.zahlAchsen = 6;
|
|
System.out.println("Anzahl Achsen: " + lkw1.zahlAchsen);
|
|
lkw1.zustand = "Schlecht";
|
|
System.out.println("Zustand des LKW: " + lkw1.zustand);
|
|
//lkw1.garantie = ... GEHT NICHT, ist nicht "sichtbar"
|
|
LKW lkw2 = new LKW(12345, 50000.60F, "BMW", "xyzhybrid", 2022, "1.1.2022", 1500, 'H', 240, "Automatik", 40.5, 4, "Toll");
|
|
System.out.println("\nDaten von Objekt LKW2: \n");
|
|
System.out.println("Fahrzeugnummer: " + lkw2.fzNr);
|
|
System.out.println("Listenpreis2: " + lkw2.listenPreis);
|
|
System.out.println("Antrieb: " + lkw2.antrieb);
|
|
System.out.println("Datum Erstzulassung: " + lkw2.datumZul);
|
|
System.out.println("Gewicht: " + lkw2.gewicht);
|
|
System.out.println("Ladekapazität: " + lkw2.ladeKap);
|
|
System.out.println("Anzahl Achsen: " + lkw2.zahlAchsen);
|
|
System.out.println("Zustand des LKW: " + lkw2.zustand);
|
|
|
|
//-----------------------------------------------------
|
|
|
|
System.out.println("\n==========Konstruktor von Klasse Fahrzeuge==========");
|
|
System.out.println("(nichts wird geerbt):\n");
|
|
|
|
Fahrzeuge fz1 = new Fahrzeuge();
|
|
fz1.datumZul ="1.1.2016";
|
|
System.out.println("Zulassung: " + fz1.datumZul);
|
|
fz1.fzNr = 12345;
|
|
System.out.println("Fahrzeugnummer: " + fz1.fzNr);
|
|
fz1.antrieb='b';
|
|
System.out.println("Antrieb: " + fz1.antrieb);
|
|
fz1.listenPreis = 120900.00F;
|
|
System.out.println("Preis: " + fz1.listenPreis);
|
|
fz1.gewicht =2.0D;
|
|
System.out.println("Gewicht: " + fz1.gewicht);
|
|
fz1.kw =140;
|
|
System.out.println("Motorleistung (kw): " + fz1.kw);
|
|
fz1.getriebe ="Schalter";
|
|
System.out.println("Getriebe: " + fz1.getriebe);
|
|
// Das klappt nicht: fz1.baujahr = 2000;
|
|
}
|
|
}
|
|
14.6 Programmlauf |
|
Folgende zwei Eingabefenster kommen zum Einsatz: |
|

|
|
|
|

|
|
|
|
Bildschirmausgabe: |
|
Konstruktor mit Klasse VAN
|
|
(geerbt wird von PKW und Fahrzeuge)
|
|
|
|
Ausgabe des Objekts der Klasse VAN im HP
|
|
OHNE DATEN mit Methode aus VAN:
|
|
|
|
Inventarnummer: 0
|
|
Hersteller: null
|
|
Bezeichnung: null
|
|
Baujahr: 0
|
|
Datum der Erstzulassung: null
|
|
Antriebsart: n
|
|
Listenpreis: 0.0
|
|
Gewicht: 0.0
|
|
Nennleistung: 0
|
|
Getriebe: null
|
|
Garantie: nicht erfaßt
|
|
Typ:null
|
|
Automatisches Fahren, Stufe: 0
|
|
Maximal Anzahl Personen: 1
|
|
Bank: false
|
|
|
|
|
|
Beschreiben aller Attribute des Objekts der Klasse VAN im HP
|
|
|
|
|
|
===========Ausgabe des Objekts der Klasse VAN im HP
|
|
Mit Daten und der Methode aus VAN:
|
|
|
|
Inventarnummer: 1007
|
|
Hersteller: Audi
|
|
Bezeichnung: Touran
|
|
Baujahr: 2020
|
|
Datum der Erstzulassung: 1.1.2020
|
|
Antriebsart: d
|
|
Listenpreis: 50000.0
|
|
Gewicht: 3.5
|
|
Nennleistung: 150
|
|
Getriebe: Automatik
|
|
Garantie: 3 Jahre
|
|
Typ:L
|
|
Automatisches Fahren, Stufe: 1
|
|
Maximal Anzahl Personen: 10
|
|
Bank: true
|
|
|
|
==========Private Methoden in Fahrzeuge aufrufen:==========/n
|
|
Derzeitiger Marktpreis vor EINTRAGEN: 0.0
|
|
Marktpreis festlegen
|
|
Derzeitiger Marktpreis nach EINTRAGEN: 40000.0
|
|
|
|
==========Methodeneinsatz für Preiserhöhung==========
|
|
Bisheriger Preis:50000.0
|
|
Alter Preis: 50000.0
|
|
Gewünschte Erhöhung: 10%
|
|
Neuer Preis: 55000.0
|
|
|
|
==========Konstruktor von Klasse LKW==========
|
|
(geerbt wird nur von Fahrzeuge):
|
|
|
|
Daten von Objekt LKW1:
|
|
|
|
Fahrzeugnummer: 123456
|
|
Listenpreis: 150299.9
|
|
Antrieb: Diesel
|
|
Datum Erstzulassung: 1.1.2010
|
|
Gewicht: 7.5
|
|
Ladekapazität: 40.5
|
|
Anzahl Achsen: 6
|
|
Zustand des LKW: Schlecht
|
|
|
|
Daten von Objekt LKW2:
|
|
|
|
Fahrzeugnummer: 12345
|
|
Listenpreis2: 50000.6
|
|
Antrieb: H
|
|
Datum Erstzulassung: 1.1.2022
|
|
Gewicht: 1500.0
|
|
Ladekapazität: 40.5
|
|
Anzahl Achsen: 4
|
|
Zustand des LKW: Toll
|
|
|
|
==========Konstruktor von Klasse Fahrzeuge==========
|
|
(nichts wird geerbt):
|
|
|
|
Zulassung: 1.1.2016
|
|
Fahrzeugnummer: 12345
|
|
Antrieb: b
|
|
Preis: 120900.0
|
|
Gewicht: 2.0
|
|
Motorleistung (kw): 140
|
|
Getriebe: Schalter
|
|
15 Projekt HS8 – Kapselung |
|
Hier werden an einfachen Beispielen die Möglichkeiten gezeigt, den Zugriff auf Instanzattribute, Variablen und Methoden zu kontrollieren. Vgl. auch Abschnitt 4.1. |
|
|
|
15.1 Klasse HP |
|
Klasse HP mit Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
Stud s1 = new Stud();
|
|
Oben: S1 wird mit dem Standardkonstruktor erzeugt. |
|
|
|
System.out.println("Leeres Objekt von HP aus mit Methode aus Stud ausgeben:");
|
|
s1.ausgeben();
|
|
Oben: Dies klappt, wegen dem Modifizierer paketsichtbar, der eingestellt ist, falls kein anderer Modifizierer explizit angegeben wird. Genauso bei protected. Gibt man dagegen in Stud vor der Methode ausgeben() private an, ist die Methode vom HP aus nicht sichbar. Ausprobieren! |
|
|
|
Stud s0 = new Stud("123", "Maier", "Klara", 5, "21.09.2002");
|
|
S0 wird erzeugt (instantiiert) und per Parameter mit Daten versorgt. |
|
|
|
System.out.println("\nBeschriebenes Objekt von HP aus mit Methode aus Stud ausgeben:");
|
|
s0.ausgeben();
|
|
Klappt wiederum, weil Zugriff vom HP kommt und der Modifizierer es erlaubt (vgl. oben). |
|
|
|
System.out.println("\nDie Ausgabe des Geburtstags klappt: " + s0.gebTag);
|
|
Das Attribut gebTag kann wegen Sichtbarkeit public abgefragt werden. |
|
|
|
System.out.println("\nDas klappt nicht: s0.name= 'Erwin'");
|
|
System.out.println("\nDas auch nicht: System.out.println(s0.name ohne Setter= + s0.name)");
|
|
Zwei Fehlschläge, verursacht durch den Sichtbarkeitsmodizierer. |
|
|
|
System.out.println("\nDirekte Abfrage s0.name mit Getter-Methode: " + s0.getName());
|
|
"Getter" hilft. |
|
|
|
System.out.println("\nDirektes Beschreiben s0.name mit Setter-Methode (Millifranz): ");
|
|
s0.setName("Millifranz");
|
|
System.out.println("\nGeänderter Name: " + s0.getName());
|
|
"Setter" ebenso. |
|
}
|
|
}
|
|
Klasse HP ohne Erläuterungen |
|
package hochschule;
|
|
|
|
public class HP {
|
|
public static void main(String[] args) {
|
|
Stud s1 = new Stud();
|
|
System.out.println("Leeres Objekt von HP aus mit Methode aus Stud ausgeben:");
|
|
s1.ausgeben();
|
|
Stud s0 = new Stud("123", "Maier", "Klara", 5, "21.09.2002");
|
|
System.out.println("\nBeschriebenes Objekt von HP aus mit Methode aus Stud ausgeben:");
|
|
s0.ausgeben();
|
|
System.out.println("\nDie Ausgabe des Geburtstags klappt: " + s0.gebTag);
|
|
System.out.println("\nDas klappt nicht: s0.name= 'Erwin'");
|
|
System.out.println("\nDas auch nicht: System.out.println(s0.name ohne Setter= + s0.name)");
|
|
System.out.println("\nDirekte Abfrage s0.name mit Getter-Methode: " + s0.getName());
|
|
System.out.println("\nDirektes Beschreiben s0.name mit Setter-Methode (Millifranz): ");
|
|
s0.setName("Millifranz");
|
|
System.out.println("\nGeänderter Name: " + s0.getName());
|
|
}
|
|
}
|
|
15.2 Klasse Stud |
|
Klasse Stud mit Erläuterungen |
|
package hochschule;
|
|
public class Stud {
|
|
private String mNr; //Matrikelnummer
|
|
protected String name;
|
|
String vName; //Modifizierer Paketsichtbar
|
|
private int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
|
|
public Stud (String mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr = mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
}
|
|
Oben: Konstruktor mit Parameterübergabe. Er wird vom HP aufgerufen, in der Klasse Stud (natürlich) ausgeführt, deshalb spielen die Sichtbarkeitsmodifizierer keine Rolle. |
|
|
|
public Stud() {
|
|
}
|
|
Standardkonstruktor. |
|
|
|
public String getName(){
|
|
return name;
|
|
}
|
|
Getter-Methode. Mit ihr ist es möglich, trotz Sichtbarkeitsmodifizierer protected das jeweilige Attribut abzufragen. Siehe HP. |
|
//Setter
|
|
public void setName(String name) {
|
|
this.name = name;
|
|
}
|
|
Setter-Methode. Mit ihr ist es möglich, trotz Sichtbarkeitsmodifizierer protected das jeweilige Attribut zu beschreiben. Siehe HP. |
|
|
|
void ausgeben() {
|
|
System.out.println("\nMatrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
Methode zum Ausgeben der Daten eines Objekts. |
|
}
|
|
Klasse Stud ohne Erläuterungen |
|
package hochschule;
|
|
public class Stud {
|
|
private String mNr; //Matrikelnummer
|
|
protected String name;
|
|
String vName; //Modifizierer Paketsichtbar
|
|
private int anzSem; //Erreichtes Semester
|
|
public String gebTag; //Geburtstag
|
|
|
|
public Stud (String mNr, String name, String vName, int anzSem, String gebTag) {
|
|
this.mNr = mNr;
|
|
this.name =name;
|
|
this.vName = vName;
|
|
this.anzSem = anzSem;
|
|
this.gebTag = gebTag;
|
|
}
|
|
public Stud() {
|
|
}
|
|
public String getName(){
|
|
return name;
|
|
}
|
|
public void setName(String name) {
|
|
this.name = name;
|
|
}
|
|
void ausgeben() {
|
|
System.out.println("\nMatrikelnummer: " + mNr);
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Vorname:" + vName);
|
|
System.out.println("Erreichtes Semester: " + anzSem);
|
|
System.out.println("Geburtstag: " + gebTag);
|
|
}
|
|
}
|
|
15.3 Programmlauf |
|
Leeres Objekt von HP aus mit Methode aus Stud ausgeben:
|
|
|
|
Matrikelnummer: null
|
|
Name: null
|
|
Vorname:null
|
|
Erreichtes Semester: 0
|
|
Geburtstag: null
|
|
|
|
Beschriebenes Objekt von HP aus mit Methode aus Stud ausgeben:
|
|
|
|
Matrikelnummer: 123
|
|
Name: Maier
|
|
Vorname:Klara
|
|
Erreichtes Semester: 5
|
|
Geburtstag: 21.09.2002
|
|
|
|
Die Ausgabe des Geburtstags klappt: 21.09.2002
|
|
|
|
Das klappt nicht: s0.name= 'Erwin'
|
|
|
|
Das auch nicht: System.out.println(s0.name ohne Setter= + s0.name)
|
|
|
|
Direkte Abfrage s0.name mit Getter-Methode: Maier
|
|
|
|
Direktes Beschreiben s0.name mit Setter-Methode (Millifranz):
|
|
16 Arbeit mit Dateien |
|
Die folgenden Projekte zeigen den Umgang mit Textdateien. Damit können in einfacher Form Daten gespeichert und bearbeitet werden, nicht wie in Datenbanksystemen, aber immerhin. Sinnvoll wäre ein in Java integriertes objektorientiertes Datenbanksystem. Das liegt aber nicht vor. |
|
Stattdessen bietet Java APIs (Application Programming Interfaces) für zahlreiche unterschiedliche Datenbanksysteme an. Unter anderem für relationale Datenbanksysteme (RDBS) und ihre Datenbanken. Dies ist sinnvoll, da RDBS sehr weit verbreitet sind. Die dafür zur Verfügung gestellten Schnittstellen werden JDBC (Java Database Connectivity) genannt. Vgl. [Ullenboom 2024, Kapitel 21]. |
|
In einer der nächsten Auflagen wird auch das hier vorgestellt, weil (natürlich) viele UML-Elemente auf Datenbestände ausgerichtet sind. |
|
Wobei dies keine wirklich zufriedenstellende Lösung ist. Relationale Datenbanken und objektorientierte sind zwei verschiedene Ansätze zur Lösung der Persistenzfrage, weshalb ihr Zusammenwirken umfangreiche technische und inhaltliche Abstimmungen verlangt. |
|
|
|
17 Projekt hsdaten |
|
In diesem Projekt wird beschrieben, wie eine Textdatei eingerichtet, beschrieben und gelesen wird. Von der Klassenbibiliothek wird dafür die Klasse java.io.File benötigt. |
|
|
|
17.1 Klasse Erstellen |
|
Hier wird mit Hilfe der Methoden der Klasse java.io.File in einem bestimmten Verzeichnis eine neue Datei erstellt. Dazu wird, wie das folgende Beispiel zeigt, im Konstruktor der Pfad, der Dateiname und evtl. weitere Informationen angegeben. |
|
Auf diese Instanz kann dann die Methode createNewFile() angewandt werden. Sie richtet die Datei im gewählten Verzeichnis ein true. Gibt es sie schon, ist der Ausdruck false und es wird angegeben, dass die Datei bereits existiert: |
|
- Datei noch nicht da, datei.createNewFile() ist erfolgreich und im Ausdruck wahr.
- Datei schon da, der Ausdruck hat den Wert false.
Klasse Erstellen mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.File;
|
|
Oben: Klasse File der Klassenbibliothek in das Programm einbinden. |
|
|
|
public class Erstellen {
|
|
public static void main(String[] args) {
|
|
try {
|
|
Try/Catch-Konstrukt. Vgl. Abschnitt 5.2. |
|
|
|
String fileName = "Stud006";
|
|
String-Variable einrichten und bespielen. |
|
|
|
File datei = new File("C://Meine Dateien// " + fileName + ".txt");
|
|
Konstruktor der Klasse File. Mit diesen Parametern wird das Verzeichnis und der Name der Datei angegeben. Das "Objekt" datei hat verschiedene Instanzmethoden. |
|
|
|
if(datei.createNewFile())
|
|
createNewFile ist eine Instanzmethode von File. Ist obiger Ausdruck wahr, kannn Erfolg gemeledet werden. |
|
System.out.println("Die Datei wurde erstellt");
|
|
else
|
|
System.out.println("Die Datei existiert bereits");
|
|
}
|
|
catch (Exception e) {
|
|
System.err.println(e);
|
|
}
|
|
}
|
|
}
|
|
Klasse Erstellen ohne Erläuterungen |
|
package hochschule;
|
|
import java.io.File;
|
|
public class Erstellen {
|
|
public static void main(String[] args) {
|
|
try {
|
|
String fileName = "Stud006";
|
|
File datei = new File("C://Meine Dateien// " + fileName + ".txt");
|
|
if(datei.createNewFile())
|
|
System.out.println("Die Datei wurde erstellt");
|
|
else
|
|
System.out.println("Die Datei existiert bereits");
|
|
}
|
|
catch (Exception e) {
|
|
System.err.println(e);
|
|
}
|
|
}
|
|
}
|
|
|
17.2 Klasse Schreiben |
|
Vgl. zu den Klassen für das Lesen und Schreiben aus bzw. in Dateien Kapitel 6.Abschnitt 6.2. In dieser Klasse wird mit der Klasse FileWriter ohne Puffern gearbeitet. Außerdem wird die Datei in einem spezifischen Verzeichnis angelegt, nicht im Standardverzeichnis (vgl. Schreiben2.java). |
|
Klasse Schreiben mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
Oben: Klassen aus dem java.io-Paket: FileWriter: Datenstromklasse, die read- und write-Methoden auf Dateien abbildet. Java.io.IOException: Diese Klasse hilft, Fehlermeldungen ("exceptions") zu organisieren. |
|
|
|
public class Schreiben {
|
|
public static void main(String[] args) {
|
|
FileWriter stud1 = null;
|
|
Eine Variable, die auf ein Objekt der Klasse FileWriter verweist, wird eingerichtet. |
|
|
|
try {
|
|
Beginn des Try/Catch-Abschnitts. Vgl. Abschnitt 5.2. |
|
|
|
String dateiBez = "stud003";
|
|
In einer Stringvariablen wird der Dateiname festgehalten. |
|
|
|
stud1 = new FileWriter("C://Meine Dateien// " + dateiBez + ".txt");
|
|
Konstruktor der Klasse FileWriter. Dieses "Objekt" richtet die Datei im angegebenen Verzeichnis ein. |
|
|
|
String text = "Sinnspruch Nummer 3\n"
|
|
+ "Der Weg ist weit, der Weg ist lang,"
|
|
+ " doch uns wird - wie immer - nicht bang.";
|
|
Text bereitstellen für das Eintragen in die Datei. |
|
|
|
stud1.write(text);
|
|
Schreiben des Textes in die Datei stud1. |
|
|
|
stud1.close();
|
|
Schließen der Datei. |
|
|
|
}
|
|
catch (IOException fehler) { System.out.println("Fehler: " + fehler);
|
|
Für den Fall, dass der Try-Abschnitt scheitert, wird eine Fehlermeldung ausgegeben. |
|
}
|
|
}
|
|
}
|
|
Klasse Schreiben ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
|
|
public class Schreiben {
|
|
public static void main(String[] args) {
|
|
FileWriter stud1 = null;
|
|
try {
|
|
String dateiBez = "stud003";
|
|
stud1 = new FileWriter("C://Meine Dateien// " + dateiBez + ".txt");
|
|
String text = "Sinnspruch Nummer 3\n"
|
|
+ "Der Weg ist weit, der Weg ist lang,"
|
|
+ " doch uns wird - wie immer - nicht bang.";
|
|
stud1.write(text);
|
|
stud1.close();
|
|
}
|
|
catch (IOException fehler) { System.out.println("Fehler: " + fehler);
|
|
}
|
|
}
|
|
}
|
|
17.3 Klasse Schreiben2 |
|
Hier wird die Klasse BufferedWriter verwendet, die einen gepufferten Datenstrom bereitstellt. Das Programm als Ganzes erzeugt eine neue Datei im Standardverzeichnis c:/eclipse/hsdaten, und trägt in diese gepuffert Daten ein. Vgl. hierzu Abschnitt 6.2. |
|
Gepuffertes Schreiben ist für umfangreiche Datenströme oder Datenströme, die in einer Schleife abgearbeitet werden, notwendig. Hier dient es Demonstrationszwecken. |
|
Klasse Schreiben2 mit Erläuterungen |
|
package hochschule;
|
|
import java.io.*;
|
|
|
|
public class Schreiben2 {
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
FileWriter fiwr = new FileWriter("Stud004.txt");
|
|
Oben: Konstruktor der Klasse FileWriter. Das "Objekt" fiwr stellt das Programmfragment für den Schreibzugriff auf die angebene Datei bereit. |
|
|
|
BufferedWriter buwr = new BufferedWriter(fiwr);
|
|
Konstruktor der Klasse BufferedWriter. Das "Objekt" buwr erlaubt das "gepufferte" Schreiben in die Datei fiwr. Obige zwei Befehle können auch gekapselt werden. Vgl. Abschnitt 6.2. |
|
Vgl. zu den E/A-Strömen Abschnitt 6.2. |
|
|
|
buwr.write("Name=Müller");
|
|
buwr.newLine();
|
|
buwr.write("Vorname=Inge");
|
|
buwr.newLine();
|
|
buwr.write("Ort=Ravensburg");
|
|
buwr.newLine();
|
|
buwr.close();
|
|
Schreiben in die Datei mit der Methode write(). Anfordern einer Leerzeile. |
|
Java-Programme sollen ja auf verschiedenen Betriebssystemen (Windows, Linux, usw.) einsetzbar sein ("Plattformunabhängigkeit"). Deshalb hier die Methode newLine() für das Anfordern einer neuen Zeile. Bleibt man unter Windows mit seinem Programm, wäre dafür auch die Zeichenfolge \n in der vorausgehenden Textausgabe möglich. Beides wird hier in den Beispielen demonstriert. |
|
}
|
|
}
|
|
Klasse Schreiben2 ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.*;
|
|
|
|
public class Schreiben2 {
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
FileWriter fiwr = new FileWriter("Stud004.txt");
|
|
BufferedWriter buwr = new BufferedWriter(fiwr);
|
|
|
|
buwr.write("Name=Müller");
|
|
buwr.newLine();
|
|
buwr.write("Vorname=Inge");
|
|
buwr.newLine();
|
|
buwr.write("Ort=Ravensburg");
|
|
buwr.newLine();
|
|
buwr.close();
|
|
}
|
|
}
|
|
17.4 Klasse Lesen |
|
Hier spielen die Klassen FileReaderund BufferedReadereine zentrale Rolle. Ein Objekt von FileReader (also eine Art Schnittstelle zur Datei) ist der Parameter von BufferedReader. |
|
Für den zeilenweisen Zugriff auf eine Textdatei sind zwei Instanzen nötig. Eine von FileReader und eine von BufferedReader. Die von FileReader erhält im Konstruktor als Parameternamen die Dateibezeichnung und, wenn sie nicht im Standardverzeichnis ist, die Pfadangabe der Datei. |
|
Diese Instanz von FileReader wird beim Konstruktor von BufferedReader als Parameter eingegeben. Damit kann dann "gepuffert", d.h. nicht zeichenweise, mit der Methode readLine() gelesen werden. Vgl. das Beispiel unten. |
|
Die beiden Konstruktor-Ereignisse können hintereinander oder verschachtelt angegeben werden. Beides ist im Programm unten angegeben. |
|
Klasse Lesen mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
|
|
public class Lesen {
|
|
|
|
public static void main(String[] args) {
|
|
BufferedReader stud1 = null;
|
|
Oben: Mit diesem Befehl wird ein Objekt der Klasse BufferedReader erzeugt, das einen zeilenweisen und gepufferten Lesezugriff auf eine Datei ermöglicht. |
|
|
|
String text;
|
|
try {
|
|
Try/Catch-Konstrukt. Vgl. Abschnitt 5.2. |
|
|
|
String dateiBez = "stud003";
|
|
|
|
System.out.println("\nDateiname:" + dateiBez + "\n");
|
|
|
|
stud1 = new BufferedReader (new FileReader("C://Meine Dateien// " + dateiBez + ".txt"));
|
|
Mit |
|
new FileReader("C://Meine Dateien// " + fileName + ".txt") |
|
wird ein Objekt der Klasse FileReader erzeugt, mit dem das Verzeichnis und die Bezeichnung einer Datei verwaltet werden können. Der Gesamtbefehl ... |
|
stud1 = new BufferedReader (new FileReader("C://Meine Dateien// " + dateiBez + ".txt")); |
|
führt dann zur Zugriffsoption, zum Öffnen der Datei im angegebenen Verzeichnis. Dessen Methode readLine() liest die Datei zeilenweise aus und gibt null zurück, wenn das Dateiende erreicht ist. |
|
|
|
Verschachtelte Konstruktorvorgänge |
|
Dieses Beispiel zeigt auch, dass es möglich ist, Konstruktorvorgänge zu verschachteln. Als Parameter in new BufferedReader wird new FileReader eingesetzt. |
|
|
|
} catch (FileNotFoundException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
try {
|
|
while ((text = stud1.readLine()) != null) {
|
|
System.out.println(text);
|
|
Lesen der Datei bis zur angegebenen Bedingung und Ausgeben des Gelesenen. |
|
}
|
|
} catch (IOException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
Try/Catch-Konstrukt. Vgl. Abschnitt 5.2. |
|
}
|
|
}
|
|
}
|
|
Klasse Schreiben ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
|
|
public class Lesen {
|
|
public static void main(String[] args) {
|
|
BufferedReader stud1 = null;
|
|
String text;
|
|
try {
|
|
String dateiBez = "stud003";
|
|
System.out.println("\nDateiname:" + dateiBez + "\n");
|
|
stud1 = new BufferedReader (new FileReader("C://Meine Dateien// " + dateiBez + ".txt"));
|
|
} catch (FileNotFoundException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
try {
|
|
while ((text = stud1.readLine()) != null) {
|
|
System.out.println(text);
|
|
}
|
|
} catch (IOException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
}
|
|
}
|
|
17.5 Klasse Anhaengen |
|
Das Programm dieser Klasse leistet folgendes: |
|
- Erfragen einer Datei und Anfügen einer Zeile in dieser.
- Einfaches Einlesen von der Konsole mit Klasse Scanner.
- Einsatz der Klasse Formatter mit dem Formatspezifizierer %s/n.
|
|
Die Klasse Formatter dient hier dazu, die Eingaben in eine Textdatei zu formatieren. Der Konstruktor: |
|
Formatter formatter = new Formatter(writer))
|
|
Er benötigt ein Objekt der Klasse FileWriter als Parameter und stellt dann die benötigte Programmfunktionalität bereit. Die Methode format erlaubt dann die Spezifizierung: |
|
formatter.format("%s%n", newInput);
|
|
Die Kürzel: |
|
- %s bedeutet unformatierte Ausgabe eines Strings.
- %n bedeutet Anforderung einer neuen Zeile.
|
|
[Ullenboom 2024, S. 668] empfiehlt wegen der großen Zahl an Formatspezifiziern diesbezüglich den Blick in die API-Dokumentation. |
|
Klasse Anhaengen mit Erläuterungen |
|
package hochschule;
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import java.util.Formatter;
|
|
import java.util.Scanner;
|
|
|
|
public class Anhaengen {
|
|
public static void main(String args[]) {
|
|
Scanner scanner = new Scanner(System.in);
|
|
Oben: Ein Objekt der Klasse Scanner wird erzeugt. D.h., es wird die Funktionalität bereitgestellt, mit der Eingaben von der Konsole gelesen werden können. Der Parameter System.in gibt an, dass die Eingabe von der Konsole kommt. |
|
|
|
System.out.println("Welche Datei (ohne .txt)?");
|
|
String fileName = scanner.next(); //stud02.txt
|
|
scanner.nextLine();
|
|
Zuerst wird auf der Konsole die angegebene Frage formuliert. Dann wird mit der Methode scanner.next() ein Eingabefeld auf der Konsole eingerichtet und für die Aufnahme der Eingabe eine String-Variable fileName angelegt. |
|
Dann wird mit der Methode scanner.next() die Konsoleneingabe (der Dateiname) gelesen und in die String-Variable fileName gespielt. |
|
Mit scanner.nextLine() wird dann die textliche Eingabe gelesen. |
|
|
|
File datei = new File("C://Meine Dateien// " + fileName + ".txt");
|
|
Konstruktor der Klasse File. Dieses Programmfragment (Objekt) stellt den Zugriff auf die angegebene Datei im jeweiligen Verzeichnis bereit. Erhält die Bezeichnung myFile. |
|
|
|
try(
|
|
FileWriter writer = new FileWriter(datei, true);
|
|
Konstruktor der (Strom-)Klasse FileWriter. Das Objekt writer stellt eine Schnittstelle zu der als Parameter angegebenen Datei her. |
|
|
|
Formatter formatter = new Formatter(writer)) {
|
|
Konstruktor der Klasse Formatter. Dieses Objekt stellt die Formatierungsmöglichkeiten für die Ausgabe von Texten bereit. Vgl. die nachfolgende Methode format() dieser Klasse. |
|
|
|
System.out.println("Eingabe: ");
|
|
String newInput = scanner.nextLine();
|
|
|
|
formatter.format("%s%n", newInput);
|
|
Zeilenweises Lesen der Eingabe (das ist der Text, der in der Datei an den vorhandenen Text angefügt wird). |
|
Zu den Formatcodes: %s bedeutet "Zeichenkette". %n bedeutet "neue Zeile" |
|
|
|
}
|
|
catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
scanner.close();
|
|
System.out.println("\nEs hat geklappt!");
|
|
Schlusssequenz. Schließen der durch die Klasse Scanner angelegten Programmfragmente. Ausgabe der Erfolgsmeldung. |
|
}
|
|
}
|
|
Zum Try/Catch-Konstrukt vgl. Abschnitt 5.2. |
|
Klasse Anhaengen ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import java.util.Formatter;
|
|
import java.util.Scanner;
|
|
|
|
public class Anhaengen {
|
|
public static void main(String args[]) {
|
|
Scanner scanner = new Scanner(System.in); //Konstruktor
|
|
System.out.println("Welche Datei (ohne .txt)?");
|
|
String fileName = scanner.next(); //stud02.txt
|
|
scanner.nextLine();
|
|
|
|
File datei = new File("C://Meine Dateien// " + fileName + ".txt");
|
|
|
|
try(
|
|
FileWriter writer = new FileWriter(datei, true);
|
|
Formatter formatter = new Formatter(writer)) {
|
|
System.out.println("Eingabe: ");
|
|
String newInput = scanner.nextLine();
|
|
formatter.format("%s%n", newInput);
|
|
}
|
|
catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
scanner.close();
|
|
System.out.println("\nEs hat geklappt!");
|
|
}
|
|
}
|
|
Beispielhafter Programmlauf |
|
Welche Datei (ohne .txt)?
|
|
stud02.txt
|
|
Eingabe:
|
|
Noch eine Zeile
|
|
|
|
Es hat geklappt!
|
|
Hier noch ein Blick auf die Datei: |
|

|
|
17.6 Klasse Loeschen |
|
Löscht Dateien im Standardverzeichnis, hier mit Windows 11 und einer Standardinstallation von Eclipse: c:/eclipse/hsdaten. Zur Scanner-Klasse vgl. die Ausführungen im obigen Abschnitt. |
|
Klasse Loeschen mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.*;
|
|
import java.util.Scanner;
|
|
|
|
public class Loeschen {
|
|
public static void main(String[] args) {
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.println("Welche Datei soll gelöscht werden (mit .txt)?");
|
|
String fileName = scanner.next(); //stud02.txt
|
|
scanner.nextLine();
|
|
Oben: Die Bezeichnung der zu löschenden Datei wird von der Konsole eingelesen. Hier wird die Datei stud02.txt gewählt. |
|
|
|
File file = new File(fileName);
|
|
Ein Objekt der Klasse File wird mit der Dateibezeichnung erzeugt. Dies repräsentiert dann die Datei in ihrem Verzeichnis und stellt Methoden zu deren Bearbeitung bereit.. |
|
|
|
if(file.delete())
|
|
{
|
|
System.out.println("Die Datei wurde gelöscht.");
|
|
}
|
|
else
|
|
{
|
|
System.out.println("Die Datei konnte nicht gelöscht werden.");
|
|
}
|
|
Die Methode file.delete() wird aufgerufen. Ist sie erfolgreich, kommt es zur Erfolgsmeldung, andernfalls zur Misserfolgsmeldung. |
|
|
|
}
|
|
}
|
|
Klasse Loeschen ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.*;
|
|
import java.util.Scanner;
|
|
|
|
public class Loeschen {
|
|
public static void main(String[] args) {
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.println("Welche Datei soll gelöscht werden (mit .txt)?");
|
|
String fileName = scanner.next(); //stud02.txt
|
|
scanner.nextLine();
|
|
File file = new File(fileName);
|
|
if(file.delete())
|
|
{
|
|
System.out.println("Die Datei wurde gelöscht.");
|
|
}
|
|
else
|
|
{
|
|
System.out.println("Die Datei konnte nicht gelöscht werden.");
|
|
}
|
|
}
|
|
}
|
|
17.7 Klasse ErzeugLoesch |
|
Hier wird zuerst eine Datei im Standardverzeichnis eingerichtet sowie beschrieben und dann wahlweise belassen oder wieder gelöscht. |
|
Klasse ErzeugLoesch mit Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.BufferedWriter;
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import javax.swing.JOptionPane;
|
|
|
|
public class ErzeugLoesch {
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
Obige IOException ist zur Fehlerbehandlung notwendig. |
|
|
|
//zuerst eine Datei erzeugen
|
|
String dateibez = "stud05";
|
|
FileWriter fiwr = new FileWriter(dateibez);
|
|
BufferedWriter buwr = new BufferedWriter(fiwr);
|
|
Mit dem "Objekt" fiwr der Klasse FileWriter wird die angegebene Datei zum Beschreiben bereitgestellt. Das "Objekt" buwr der Klasse BufferedWriter stellt Methoden für das gepufferte Schreiben bereit. Der Parameter ist hier die Bezeichnung des File Writer-Objekts. Vgl. auch Abschnitt 6.2. |
|
|
|
buwr.write("Name=Müller");
|
|
buwr.newLine();
|
|
buwr.write("Vorname=Inge");
|
|
buwr.newLine();
|
|
buwr.write("Ort=Ravensburg");
|
|
buwr.newLine();
|
|
buwr.close();
|
|
Mit den Methoden newLine() (Neue Zeile anfordern) und write() (Zeile in die Datei eintragen) wird die Datei beschrieben. |
|
|
|
System.out.println("Datei " + dateibez + "
|
|
wurde im Standardverzeichnis erzeugt");
|
|
String eingabe = JOptionPane.showInputDialog("Datei wieder löschen (j/n)?");
|
|
Die Eingabe in die grafische Eingabeaufforderung (siehe unten) führt zu einem String. |
|
|
|
char erster = eingabe.charAt(0);
|
|
Da der Umgang mit Strings manchmal schwierig ist und als Beispiel hier das Auslesen des ersten Stringelements in ein Character-Zeichen, mit dem dann die Abfrage ob j/J oder n/N vorliegt einfacher ist. |
|
|
|
if ((erster == 'j') || (erster == 'J')) {
|
|
System.out.println("j wurde erkannt");
|
|
File file = new File(dateibez);
|
|
In dateibez steht die Bezeichnung der Datei. Damit wird ein Objekt der Klasse File erzeugt. Dies repräsentiert die Datei in ihrem Verzeichnis. |
|
|
|
if(file.delete())
|
|
{
|
|
Dann wird mit dieser Dateibezeichnung die Methode file.delete() zum Löschen der Datei aufgerufen. Ist sie erfolgreich, kommt es zur Erfolgsmeldung, andernfalls zur Misserfolgsmeldung |
|
|
|
System.out.println("Die Datei wurde gelöscht.");
|
|
}
|
|
else
|
|
{
|
|
System.out.println("Die Datei konnte nicht gelöscht werden.");
|
|
}
|
|
}
|
|
else if ((erster == 'n' ) || (erster == 'N')) {
|
|
System.out.println("Datei wird nicht gelöscht");
|
|
}
|
|
else System.out.println("Fehlerhafte Eingabe");
|
|
}
|
|
Klasse ErzeugLoesch ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.BufferedWriter;
|
|
import java.io.File;
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import javax.swing.JOptionPane;
|
|
|
|
public class ErzeugLoesch {
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
String dateibez = "stud05";
|
|
FileWriter fiwr = new FileWriter(dateibez);
|
|
BufferedWriter buwr = new BufferedWriter(fiwr);
|
|
buwr.write("Name=Müller");
|
|
buwr.newLine();
|
|
buwr.write("Vorname=Inge");
|
|
buwr.newLine();
|
|
buwr.write("Ort=Ravensburg");
|
|
buwr.newLine();
|
|
buwr.close();
|
|
System.out.println("Datei " + dateibez + " wurde im Standardverzeichnis erzeugt");
|
|
String eingabe = JOptionPane.showInputDialog("Datei wieder löschen (j/n)?");
|
|
char erster = eingabe.charAt(0);
|
|
if ((erster == 'j') || (erster == 'J')) {
|
|
|
|
System.out.println("j wurde erkannt");
|
|
|
|
File file = new File(dateibez);
|
|
if(file.delete())
|
|
{
|
|
|
|
System.out.println("Die Datei wurde gelöscht.");
|
|
}
|
|
else
|
|
{
|
|
System.out.println("Die Datei konnte nicht gelöscht werden.");
|
|
}
|
|
}
|
|
else if ((erster == 'n' ) || (erster == 'N')) {
|
|
System.out.println("Datei wird nicht gelöscht");
|
|
}
|
|
else System.out.println("Fehlerhafte Eingabe");
|
|
}
|
|
Eingabefenster: |
|
|
|

|
|
|
|
17.8 Klasse EinlesenCSV |
|
CSV bedeutet Comma separated value und meint eine Textdatei, deren Inhalte auf eine bestimmte Art strukturiert sind. Vgl. unten. Für dieses Beispiel wurde eine Excel-Datei (mitarbeiter.csv) mit einigen wenigen Zeilen erzeugt und als CSV-Datei abgespeichert. In Notepad sieht dies dann so aus: |
|

|
|
Zum Nachvollziehen sollte eine entsprechende Datei im Standardverzeichnis (hier mit Windows 11: c:\eclipse\hsdaten) eingerichtet werden. Dies klappt nur, falls die Excel-Datei als CSV/UTF-8 gespeichert wird. |
Beachten! |
Klasse EinlesenCSV mit Erläuterungen |
|
package hsdaten5;
|
|
|
|
import java.io.File;
|
|
import java.util.Scanner;
|
|
import java.io.BufferedReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
|
|
public class EinlesenCSV {
|
|
|
|
public static void main(String[] args) throws FileNotFoundException {
|
|
File CSVDatei = new File("mitarbeiter.csv");
|
|
Oben: Konstruktor der Klasse File. Vgl. Abschnitt 6.3. |
|
|
|
Scanner lesen = new Scanner(CSVDatei, "UTF-8");
|
|
Konstruktor der Klasse Scanner. Richtet ein "Scanner-Objekt" ein, mit dem von der Konsole gelesen werden kann. Klappt nur, falls Excel-Datei als CSV/UTF-8 gespeichert ist. Er erhält als Parameter die Dateibezeichnung und die Angabe des Zeichencodes (8-Bit UCS Transformation Code). |
|
|
|
lesen.useDelimiter(";");
|
|
Die Instanzenmethode useDelimiter() wird auf die zum Scannen bereitgestellte Datei angewandt. Hier wird das Trennzeichen zwischen den Einzeleinträgen geklärt. Vgl. die Ausgabe unten. |
|
|
|
System.out.println("\nZum Testen, einfache Ausgabe als CSV-Datei:\n");
|
|
while (lesen.hasNext())
|
|
{
|
|
System.out.print(lesen.next() + " / ");
|
|
}
|
|
lesen.close();
|
|
|
|
System.out.println("\n\nEinfache Ausgabe als Testdatei:");
|
|
BufferedReaderstud1 = null;
|
|
String text;
|
|
try {
|
|
String fileName = "mitarbeiter.csv";
|
|
System.out.println("Dateiname:" + fileName + "\n");
|
|
stud1 = new BufferedReader (new FileReader(fileName ));
|
|
Zum Try/Catch-Konstrukt vgl. Abschnitt 5.2. |
|
Hier liegen wiederum verkapselte "Konstruktor-Objekte" vor. Als Parameter von BufferedReader dient ein FileReader-Objekt.: stud1 = new BufferedReader (new FileReader(fileName )); |
|
|
|
} catch (FileNotFoundException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
|
|
try {
|
|
while ((text = stud1.readLine()) != null) {
|
|
System.out.println(text);
|
|
}
|
|
} catch (IOException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
Noch ein Try/Catch-Konstrukt. Diesmal mit einer Schleife zum Lesen und Ausgeben der Zeilen der Datei und für die evtl. Fehlermeldung. |
|
}
|
|
}
|
|
Klasse EinlesenCSV ohne Erläuterungen |
|
package hochschule;
|
|
|
|
import java.io.File;
|
|
import java.io.BufferedReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
import java.util.Scanner;
|
|
|
|
public class EinlesenCSV {
|
|
|
|
public static void main(String[] args) throws FileNotFoundException {
|
|
File CSVDatei = new File("mitarbeiter.csv");
|
|
Scanner lesen = new Scanner(CSVDatei, "UTF-8");
|
|
lesen.useDelimiter(";");
|
|
System.out.println("\nAusgabe als CSV-Datei:\n");
|
|
while (lesen.hasNext())
|
|
{
|
|
System.out.print(lesen.next() + " / ");
|
|
}
|
|
lesen.close();
|
|
|
|
System.out.println("\n\nZum Testen, einfache Ausgabe als Textdatei:\n");
|
|
BufferedReader stud1 = null;
|
|
String text;
|
|
try {
|
|
String fileName = "mitarbeiter.csv";
|
|
System.out.println("Dateiname: " + fileName + "\n");
|
|
stud1 = new BufferedReader(new FileReader(fileName ));
|
|
|
|
} catch (FileNotFoundException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
try {
|
|
while ((text = stud1.readLine()) != null) {
|
|
System.out.println(text);
|
|
}
|
|
} catch (IOException fehler) {
|
|
System.out.println("Fehler: " + fehler);
|
|
}
|
|
}
|
|
}
|
|
Ausgabe |
|
Ausgabe als CSV-Datei:
|
|
|
|
nachname / vorname / mitarbeiternummer / abteilung
|
|
Tanzer / Toni / 1234 / KA
|
|
Leoprecht / Max / 3712 / IT
|
|
Honig / Fritz / 3713 / ORG
|
|
Mälker / Kai / 9876 / PW
|
|
Staud / Josef / 1097 / IT
|
|
|
|
Zum Testen, einfache Ausgabe als Textdatei:
|
|
|
|
Dateiname: mitarbeiter.csv
|
|
|
|
nachname;vorname;mitarbeiternummer;abteilung
|
|
Tanzer;Toni;1234;KA
|
|
Leoprecht;Max;3712;IT
|
|
Honig;Fritz;3713;ORG
|
|
Mälker;Kai;9876;PW
|
|
Staud;Josef;1097;IT
|
|
|
|
18 Literatur |
|
Habelitz 2022 Habelitz, Hans-Peter: Programmieren lernen mit Java. (7. Auflage). Print-Ausgabe. Bonn 2022 (Rheinwerk). |
|
Habelitz 2025 Habelitz, Hans-Peter: Programmieren lernen mit Java. (8. Auflage). E-Book. Bonn 2025 (Rheinwerk) |
|
Kofler 2022 Kofler, Michael: Java. Der Grundkurs. Bonn 2022 (Rheinwerk) |
|
Pepper 2007 Pepper, Peter: Programmieren lernen. Eine grundlegende Einführung mit Java (3. Auflage), Berlin und Heidelberg 2007 (Springer-Verlag) |
|
Ratz et al. 2018 Ratz, Dietmar; Schulmeister-Zimolong, Dennis; Seese, Detlef; Wiesenberger, Jan: Grundkurs Programmieren in Java (8. Auflage). München 2018 |
|
Steppan 2020 Steppan, Berhard: Einstieg in Java mit Eclipse. München 2020 (Hanser) |
|
Ullenboom 2022 Ullenboom, Christian: Java ist auch eine Insel. Einführung, Ausbildung, Praxis. (16. Auflage). Bonn 2022 (Rheinwerk-Verlag) |
|
|
|
|