Java Übung & Lösung zum Umgang mit Instanz- und Klassenmethoden
In dieser Java Übung möchte ich den Inhalt der letzten Lektionen wiederholen.
Ich möchte den Unterschied zwischen Klassen- und Instanzmethoden und zwischen Variablen demonstrieren.
Erstelle für diese Übung drei Klassen.
- Klasse 1 namens „Copyshop“
- Klasse 2 namens „Kopiergerät“
- Klasse 3 namens „Farbscanner“
Die Klasse Copyshop ist die Programmklasse.
Sie enthält die main-Methode.
- Implementiere in der Klasse Kopiergerät eine Möglichkeit, die Kopiergeräte zu zählen.
- Implementiere außerdem eine Variable, welche die Anzahl der kopierten Seiten, je Kopiergerät speichert.
- Außerdem benötigst du eine Variable, welche die Kopiervorgänge (wie oft kopiert wird) je Gerät erfasst.
Des Weiteren soll die Klasse eine spezielle Kopiermethode anbieten.
Diese Methode erwartet eine Anzahl an Kopien.
Du übergibst somit der Methode beim Aufruf eine Anzahl und der Wert der Instanzvariablen (kopierte Seiten) erhöht sich.
Das bedeutet:
Jedes Mal, wenn kopiert wird – wird der Wert der Instanzvariablen erhöht und dann zurückgegeben.
Die zweite Klasse „Farbscanner“ funktioniert genauso.
- Die Farbscanner sollen gezählt werden.
- Die angebotene Methode soll scannen.
Auch diese Methode erwartet eine Papieranzahl.
Jedes Mal wenn gescannt wird, soll die Anzahl der Scannvorgänge und die Papieranzahl, je Scanner gespeichert werden.
In der Copyshop Klasse legst du jeweils drei Scanner und drei Kopierer an.
- Scanner 1 hat den Namen: DT84
- Scanner 2 hat den Namen: XS75
- Scanner 3 hat den Namen: 75B
- Kopierer 1 hat den Namen: JG654
- Kopierer 2 hat den Namen: FP76
- Kopierer 3 hat den Namen: 6534XS
Führe für jedes Gerät mindestens zwei Kopier- oder Scannvorgänge durch.
Die Papieranzahl, welche du den Methoden übergibst, kannst du in den Klammern ablesen.
- Scanner 1 DT84: (200, 400)
- Scanner 2 XS75: (800, 20)
- Scanner 3 75B: (196, 23, 34)
- Kopierer 1 JG654: (8, 98)
- Kopierer 2 FP76: (17, 4)
- Kopierer 3 6534XS: (44, 23, 195)
Ich steh auf Statistiken und Kennzahlen.
Und deshalb….
möchte ich, dass beim Programmstart mir Statistiken zurück gegeben werden.
Und diese wären:
- Anzahl der Scannvorgänge je Gerät (mit spezifischen Namen)
- Anzahl Kopiervorgänge aller Geräte
- Anzahl der Geräte im Copyshop
- Durchschnittliche Anzahl der gescannten Papiere je Vorgang
- Durchschnittliche Anzahl der Kopien je Kopiergerät
Inhalt
- 1 Für diese Java Übung gibt es mehrere Lösungen
- 1.1 Schritt 1: Entwurf der Kopier- und Farbscannerklasse
- 1.2 Schritt 2: Bei der Erstellung hat jedes Objekt einen Namen. Jedes Gerät hat einen bestimmten Namen. Dieser ändert sich auch niemals. Es macht also durchaus Sinn, bei der Erstellung des Objektes den Namen gleich festzulegen. Deshalb benötigst du einen Konstruktor, welcher den Namen entgegennimmt. Der Konstruktor besitzt somit eine Parameterliste, welche den Namen erwartet. Im Konstruktorrumpf wird dann der Name der entsprechenden Instanzvariablen zugewiesen. Und so sehen dann beide Klassen aus. public class Farbscanner { String scannerName; //Objektvariable vom Datentyyp String int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer public Farbscanner(String scannerName){ //Konstruktor this.scannerName=scannerName;//Zuweisung des Scanner-Namens } } public class KopierGeraete { String kopiererName; //Objektvariable vom Datentyyp String int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer public KopierGeraete(String kopiererName){ //Konstruktor this.kopiererName=kopiererName;//Zuweisung des Kopierer-Namens } } Schritt 3: Lass uns die Geräte zählen
- 1.3 Schritt 4: Die Methode, welche die Anzahl der Kopierer und Scanner zurückgibt, kommt in den Copyshop. Ich habe die Namensvergabe dir überlassen. Du kannst somit die Methode nennen wie du möchtest. Ich empfehle dir nur eine Verbform zu wählen. Beispielsweise: „zähleGeraete“ oder „gibAnzahlZurück“ oder Ähnliches. Ich nenne die Methoden „zaehleGeraete“. Da diese Methode auf beide Objektklassen zugreift, wird es schwierig sich zu entscheiden, wo du diese implementierst. Ich implementiere diese direkt in die Programmklasse, also in den Copyshop. Die Methode wird eine statische Methode sein. Dies hat den Vorteil, dass ich kein Objekt erzeugen muss, um diese aufzurufen. public class CopyShop { static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner."); System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer."); System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl)+" Geräte.")); } public static void main(String[] args) { } } Die Methode liefert jetzt drei Konsolenausgaben. Die Anzahl der Kopierer Die Anzahl der Scanner Die Summe aller Geräte-Anzahlen Da die Variablen sich in anderen Klassen befinden, kannst du nicht ohne Weiteres darauf zu greifen. Du musst zuerst die entsprechende Klasse ausweisen (Farbscanner und KopierGeraete) Und dann greifst du per Punktnotation auf die Klassenvariablen zu. Schritt 5: Lass uns die Objekte erstellen und die Geräte zählen An so einem Punkt macht es Sinn das Ganze zu testen. Deshalb erstellst du jetzt die ersten Objekte und prüfst ob alles soweit funktioniert. Dazu rufst du außerdem die „zaehleGeraete-Methode“ auf. public class CopyShop { static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner."); System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer."); System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte.")); } public static void main(String[] args) { Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer zaehleGeraete(); //Aufruf der statischen Zählen Methode } } Klicke auf „Run“ und schau, was passiert. Und? Die Konsole gibt jetzt die Anzahlen der Scanner, Kopierer und Gesamtanzahlen zurück. Alles gut.. Schritt 6: Lass uns endlich kopieren und scannen
- 1.4 Schritt 7: Jetzt rufst du die Java Methoden am Objekt auf. Zurück in die Copyshop-Klasse. Die Objekte hast du bereits erstellt. Du kannst jetzt zu jedem Objekt jeweils die Instanzmethoden aufrufen. Ich mache dies aufgrund der Länge des Code jeweils nur für den ersten Scanner und den ersten Kopierer. Hier nochmal die Daten: Scanner 1- Name: DT84, Scannvorgänge 2, Papiermenge: 200 und 400 Kopierer1- Name: JG654, Kopiervorgänge2, Papiermenge: 8 und 98 Und los geht’s. public class CopyShop { static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner."); System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer."); System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte.")); } public static void main(String[] args) { Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer zaehleGeraete(); //Aufruf der statischen Zählen Methode scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");//Infos kopierer1.kopierePapier(8);//Methodenaufruf für 8 Blatt kopieren kopierer1.kopierePapier(98);//Methodenaufruf mit 98 Blatt System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");//infos } } Was jetzt noch blöd ist, sind die Konsolenausgaben. Bei jedem Scann- oder Kopiervorgang müsstest du diese unter dem Methodenaufruf schreiben. Außerdem könntest du versehentlich Fehler einbauen. Du möchtest dir vielleicht Ausgaben zum Scanner3 anzeigen lassen…. In der Anweisung beziehst du dich aber auf Scanner 2. Ja so etwas passiert. Wenn du bestimmte Inhalte an verschiedenen Stellen anbietest. Und diese Inhalt machen eigentlich immer wieder das Gleiche. Dann lagere so etwas in Methoden aus und biete diese an. Genau dafür sind Methoden da. Schritt 8: Die Info-Anzeigen in eine separate Methode auslagern.
- 1.5 Zurück zum Copyshop
- 1.6 Schritt 9: Jetzt noch die Gesamtstatistik
- 2 Weil es ganz schön viel war – Hier der komplette Code zu dieser Java Übung
Für diese Java Übung gibt es mehrere Lösungen
Ich stelle dir hier eine Lösung vor.
Natürlich kannst du das Ganze auch anders abbilden.
„Viele Wege führen nach Rom.“
Hauptsache- es funktioniert.
Bevor du anfängst, solltest du dir überlegen, welche Variablen du benötigst.
Du benötigst jeweils den Gerätenamen.
Die Blattanzahl
Eine Vorgangsanzahl (Anzahl Scann- bzw. Kopiervorgänge)
Und die Anzahl der Geräte.
Schritt 1: Entwurf der Kopier- und Farbscannerklasse
So sieht der vorerst geschriebene Code der beiden Klassen aus.
public class Farbscanner {
String scannerName; //Objektvariable vom Datentyyp String
int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer
int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer
}
public class KopierGeraete {
String kopiererName; //Objektvariable vom Datentyyp String
int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer
int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer
}
Ganz kurz zu den Variablen.
Die Anzahl der Vorgänge, der Gerätename und die Anzahl der Seiten sind jeweils gerätespezifisch.
Das bedeutet jedes Gerat hat seinen eigenen Wert.
Deshalb sind diese Variablen Objekt- bzw. Instanzvariablen.
Die Anzahl der Scanner oder Kopierer ist nicht gerätespezifisch.
Diese Variable steht allen Geräten zur Verfügung.
Deshalb handelt es sich hierbei um Klassenvariablen.
Schritt 2: Bei der Erstellung hat jedes Objekt einen Namen.
Jedes Gerät hat einen bestimmten Namen.
Dieser ändert sich auch niemals.
Es macht also durchaus Sinn, bei der Erstellung des Objektes den Namen gleich festzulegen.
Deshalb benötigst du einen Konstruktor, welcher den Namen entgegennimmt.
Der Konstruktor besitzt somit eine Parameterliste, welche den Namen erwartet.
Im Konstruktorrumpf wird dann der Name der entsprechenden Instanzvariablen zugewiesen.
Und so sehen dann beide Klassen aus.
public class Farbscanner {
String scannerName; //Objektvariable vom Datentyyp String
int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer
int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public Farbscanner(String scannerName){ //Konstruktor
this.scannerName=scannerName;//Zuweisung des Scanner-Namens
}
}
public class KopierGeraete {
String kopiererName; //Objektvariable vom Datentyyp String
int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer
int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public KopierGeraete(String kopiererName){ //Konstruktor
this.kopiererName=kopiererName;//Zuweisung des Kopierer-Namens
}
}
Schritt 3: Lass uns die Geräte zählen
Gezählt wird bei der Erstellung des Objektes.
Immer wenn ein Objekt erstellt wird, erhöht sich die Geräteanzahl um eins.
Deshalb kannst du die Anweisung zur Erhöhung der Anzahl im Konstruktor einsetzen.
Jedes Mal, wenn der Konstruktor aufgerufen wird, wird die Anzahl um eins erhöht.
Und so sieht der Code dann aus.
public class Farbscanner {
String scannerName; //Objektvariable vom Datentyyp String
int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer
int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public Farbscanner(String scannerName){ //Konstruktor
this.scannerName=scannerName;//Zuweisung des Scanner-Namens
scannerGeraetAnzahl=scannerGeraetAnzahl+1;//Scanneranzahl wird bei jedem Aufruf um eins erhöht
}
}
public class KopierGeraete {
String kopiererName; //Objektvariable vom Datentyyp String
int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer
int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public KopierGeraete(String kopiererName){ //Konstruktor
this.kopiererName=kopiererName;//Zuweisung des Kopierer-Namens
kopierGeraetAnzahl=kopierGeraetAnzahl+1;//Kopiereranzahl wird bei jedem Aufruf um eins erhöht
}
}
Schritt 4: Die Methode, welche die Anzahl der Kopierer und Scanner zurückgibt, kommt in den Copyshop.
Ich habe die Namensvergabe dir überlassen.
Du kannst somit die Methode nennen wie du möchtest.
Ich empfehle dir nur eine Verbform zu wählen.
Beispielsweise: „zähleGeraete“ oder „gibAnzahlZurück“ oder Ähnliches.
Ich nenne die Methoden „zaehleGeraete“.
Da diese Methode auf beide Objektklassen zugreift, wird es schwierig sich zu entscheiden, wo du diese implementierst.
Ich implementiere diese direkt in die Programmklasse, also in den Copyshop.
Die Methode wird eine statische Methode sein.
Dies hat den Vorteil, dass ich kein Objekt erzeugen muss, um diese aufzurufen.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl)+" Geräte."));
}
public static void main(String[] args) {
}
}
Die Methode liefert jetzt drei Konsolenausgaben.
- Die Anzahl der Kopierer
- Die Anzahl der Scanner
- Die Summe aller Geräte-Anzahlen
Da die Variablen sich in anderen Klassen befinden, kannst du nicht ohne Weiteres darauf zu greifen.
Du musst zuerst die entsprechende Klasse ausweisen (Farbscanner und KopierGeraete)
Und dann greifst du per Punktnotation auf die Klassenvariablen zu.
Schritt 5: Lass uns die Objekte erstellen und die Geräte zählen
An so einem Punkt macht es Sinn das Ganze zu testen.
Deshalb erstellst du jetzt die ersten Objekte und prüfst ob alles soweit funktioniert.
Dazu rufst du außerdem die „zaehleGeraete-Methode“ auf.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
}
}
Klicke auf „Run“ und schau, was passiert.
Und?
Die Konsole gibt jetzt die Anzahlen der Scanner, Kopierer und Gesamtanzahlen zurück.
Alles gut..
Schritt 6: Lass uns endlich kopieren und scannen
Die Methoden zum Scannen und Kopieren sind objektspezifisch.
Du musst diese deshalb als Objektmethoden implementieren.
Zur Erinnerung:
Die Methoden sollen jeweils eine Papiermenge entgegen nehmen und dann sollen diese objektbezogen summiert werden.
Außerdem sollen die Scann- und auch die Kopiervorgänge je Gerät gezählt werden.
Somit sollten diese Methoden beim Aufruf eine Scann- bzw. Kopieanzahl übergeben bekommen.
Da die Anzahl der kopierten bzw. gescannten Blätter keine Kommazahl sein kann, macht es Sinn einen Integer-Datentypen zu wählen.
Und so sieht dann die Farbscanner- Klasse aus.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um übergebene Anzahl // Papiernzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und analog die Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Bei jedem Scann- oder Kopiervorgang erhöhen die entsprechenden Methoden die Instanzvariablen „scannPapierAnzahl“ und „kopierPapierAnzahl“ um jeweils die Menge, welche du als Parameter übergeben würdest.
Als zweiten Schritt erhöhen die Methoden die Instanzvariablen „kopierVorgangAnzahl“ und „scannVorgangAnzahl“ um jeweils eins.
Schritt 7: Jetzt rufst du die Java Methoden am Objekt auf.
Zurück in die Copyshop-Klasse.
Die Objekte hast du bereits erstellt.
Du kannst jetzt zu jedem Objekt jeweils die Instanzmethoden aufrufen.
Ich mache dies aufgrund der Länge des Code jeweils nur für den ersten Scanner und den ersten Kopierer.
Hier nochmal die Daten:
- Scanner 1- Name: DT84, Scannvorgänge 2, Papiermenge: 200 und 400
- Kopierer1- Name: JG654, Kopiervorgänge2, Papiermenge: 8 und 98
Und los geht’s.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");//Infos
kopierer1.kopierePapier(8);//Methodenaufruf für 8 Blatt kopieren
kopierer1.kopierePapier(98);//Methodenaufruf mit 98 Blatt
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");//infos
}
}
Was jetzt noch blöd ist, sind die Konsolenausgaben.
Bei jedem Scann- oder Kopiervorgang müsstest du diese unter dem Methodenaufruf schreiben.
Außerdem könntest du versehentlich Fehler einbauen.
Du möchtest dir vielleicht Ausgaben zum Scanner3 anzeigen lassen….
In der Anweisung beziehst du dich aber auf Scanner 2.
Ja so etwas passiert.
Wenn du bestimmte Inhalte an verschiedenen Stellen anbietest.
Und diese Inhalt machen eigentlich immer wieder das Gleiche.
Dann lagere so etwas in Methoden aus und biete diese an.
Genau dafür sind Methoden da.
Schritt 8: Die Info-Anzeigen in eine separate Methode auslagern.
Lass uns kurz nachdenken.
Was soll die Methode tun?
Sie soll bei jedem Scan- oder Kopiervorgang Infos herausgeben.
Und zwar soll die Papiermenge, die Summe aller bisherigen Papiermengen und die Anzahl der Scan-bzw. Kopiervorgänge zurückgegeben werden.
Und das Ganze soll objektbezogen sein.
Du brauchst also für die Scanner- und für die Kopierklasse jeweils eine Instanzmethode.
Und so würde diese Methode für den Farbscanner aussehen:
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
}
Die Methode gibt die Werte aller drei Instanzvariablen zurück.
Jetzt benötigt diese Methode noch die durchschnittliche Anzahl gescannter Blätter je Vorgang.
Und dies kannst du berechnen, indem du die Papieranzahl („scannPapierAnzahl“) durch die Vorgangsanzahl („scannVorgangAnzahl“) dividierst.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Anzahl je Vorgang: "+(scannPapierAnzahl/scannVorgangAnzahl)); //Durchschnitt
System.out.println("");//leere Zwischenzeile
}
Da bei einer Division meistens Kommazahlen entstehen, musst du den Datentyp der Instanzvariablen casten.
Sowohl „scannPapierAnzahl“ als auch „scannVorgangAnzahl“ sind beides Integer Datentypen.
Es werden also ganze Zahlen gespeichert und auch zurück gegeben.
Caste beide Datentypen auf double und das Ergebnis ist eine Kommazahl.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));//Durchschnitt als Kommazahl
System.out.println("");//Zwischenzeile
}
Eins fehlt noch.
Du bekommst zwar die Info über die Summe aller gescannten Papiere.
Aber die gescannten Papiere des aktuellen Vorganges bekommst du nicht.
Da die „druckeScannInfos-Methode“ sowieso bei jedem Scanvorgang aufgerufen werden soll, wird der Methodenaufruf in der „scannePapier-Methode“ implementiert.
Und dann kann die „Info-Methode“ auch den Parameter der „scan-Methode“ entgegen nehmen.
Hier ist die Farbscanner-Klasse mit der Info-Methode.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um papierAnzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
druckeScannInfos(papierAnzahl);//Methodenaufruf - der Parameter "papierAnzahl" wird weiter gegeben
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Parameter aus der ScannePapier-Methode
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//leere Zwischenzeile wird eingefügt
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und analog dazu die Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Kopierer
System.out.println("Jetzige Kopien: "+papierAnzahl);//lokale Variable aus kopierePapier-Methode
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl); //Papieranzahl alle Vorgänge
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Zurück zum Copyshop
Jetzt kannst du in der Klasse Copyshop die Bildschirmanzeigen löschen.
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");
Lösche diese beiden Anweisungen und klicke auf „Run“.
Dir werden alle Infos zu den Scan- als auch zu den Kopiervorgängen angezeigt.
Schritt 9: Jetzt noch die Gesamtstatistik
Schau dir die Aufgabenstellung noch einmal an!
- Anzahl der Scannvorgänge je Gerät (mit spezifischen Namen) – erledigt
- Anzahl Kopiervorgänge aller Geräte
- Anzahl der Geräte im Copyshop – erledigt
- Durchschnittliche Anzahl der gescannten Papiere je Vorgang –erledigt
- Durchschnittliche Anzahl der Kopien je Kopiergerät
Beginne mit der Anzahl der Kopiervorgänge über alle Geräte.
Zur Erinnerung. Dir werden zur Zeit nur die Vorgänge je Gerät angezeigt.
Damit du alle Vorgänge speichern kannst, brauchst du eine neue Variable.
Und zwar wieder eine Klassenvariable.
Lege also jeweils eine Variable „scannVorgangAnzahlAlle“ und „kopierVorgangAnzahlAlle“ in den jeweiligen Klassen an.
Da sich die Variablen mit jedem Scan- oder Kopiervorgang um jeweils eins erhöhen, implementiere das Ganze in die entsprechenden Methoden.
Und so sieht das Ganze in der Farbscanner-Klasse aus.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl;
int scannVorgangAnzahl;
static int scannerGeraetAnzahl;
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scans um 1
druckeScannInfos(papierAnzahl);
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName);
System.out.println("Jetziger Scan: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");
}
public Farbscanner(String scannerName) {
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und wieder analog in Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl;
int kopierVorgangAnzahl;
static int kopierGeraetAnzahl;
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Kopierer
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Kopiervorgänge aller Kopierer wird erhöht
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName);
System.out.println("Jetzige Kopien: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");
}
public KopierGeraete(String kopiererName) {
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Und in der Copyshop-Klasse bietest du eine Methode an, welche diese Werte ausgibt.
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
Da du in der Methode wieder eine Klassenvariable aufrufst, musst du die entsprechende Klasse explizit ausweisen.
Und dann kannst du per Punktnotation auf diese Variable zugreifen.
Da die Gesamtanzahl der Geräte auch nur ein Teil des Gesamtberichtes ist, kannst du den Methodenaufruf in der „gibGesamtBericht-Methode“ implementieren.
Dadurch musst du diese Methode nicht mehr innerhalb der main -Methode aufrufen.
So sieht die Klasse Copyshop jetzt aus.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");
Farbscanner scanner3 = new Farbscanner ("75B");
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76");
KopierGeraete kopierer3 = new KopierGeraete("6534XS");
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
gibGesamtBericht();
}
}
Jetzt kennst du die Anzahl aller Kopiervorgänge je Gerät.
Aber du kennst jetzt auch die Summe aller Kopiervorgänge aller Geräte.
Und das Selbe gilt für die Farbscanner.
Wenn Du jetzt noch Bock hast, kannst du dir natürlich noch
- die Anzahl aller kopierten Blätter über allen Geräten
- die Anzahl aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller kopierten Dokumente über alle Kopierer
anzeigen lassen.
Weil es ganz schön viel war – Hier der komplette Code zu dieser Java Übung
Die Farbscanner Klasse komplett:
public class Farbscanner {
String scannerName; //Name des Scanners
int scannPapierAnzahl; //gescannte Papiere je Scanner
int scannVorgangAnzahl; //Scanvorgänge je Scanner
static int scannerGeraetAnzahl; //Anzahl aller Scann-Geräte
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
static int scannPapierAnzahlAlle; //speichert alle gescannten Papiere aller Scanner
/*
* Die Scanne-Papier-Methode erwartet einen Parameter beim Aufruf.
* Dieser Wert erhöht die Instanzvariable gerätespezifische Papieranzahl ("scannPapierAnzahl").
* Dieser Wert erhöht auch die Papieranzahl aller Scangeräte ("scannPapierAnzahlAlle").
* Die Anzahl der geräteabhängigen Scannvorgänge wird automatisch um 1 erhöht.
* Die Anzahl der Scanvorgänge aller Geräte wird automatisch um 1 erhöht.
*/
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;//Papieranzahl Gerät wird erhöht
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;//Scanvorgang je Gerät wird um 1 erhöht
scannPapierAnzahlAlle=scannPapierAnzahlAlle+papierAnzahl;//Papieranzahl aller Scan-Geräte wird erhöht
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scanvorgänge aller Geräte um 1
druckeScannInfos(papierAnzahl); //Methodenaufruf und Parameterweitergabe
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Übernahme aus "scannePapier-Methode"
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);//Papieranzahl aller Scans dieses Gerätes
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Vorgangsanzahl aller Scans dieses Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public Farbscanner(String scannerName) { //Konstruktor erwartet den Namen beim Aufruf
this.scannerName = scannerName; //Zuweisung der Instanzvariable
scannerGeraetAnzahl = scannerGeraetAnzahl + 1; //Geräteanzahl wird erhöht
}
}
Die Kopiergeräte-Klasse komplett
public class KopierGeraete {
String kopiererName; //Name des Kopierers
int kopierPapierAnzahl; //kopierte Anzahl je Gerät
int kopierVorgangAnzahl; //Kopiervorgänge je Gerät
static int kopierGeraetAnzahl; //Anzahl Kopiergeräte
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Geräte
static int kopierPapierAnzahlAlle;//Speichert alle kopierten Papierer aller Geräte
/*
* Die "kopierePapier-Methode" erwartet beim Aufruf einen Paremeter.
* Um diesen Wert wird die gerätespezifische Instanzvariable "kopierPapierAnzahl" erhöht.
* Außerdem wird der Wert aller Kopiergeräte erhöht ("kopierPapierAnzahlAlle").
* Die Vorgangsanzahl des Gerätes wird automatisch um 1 erhöht.
* Die Vorgangsanzahl aller Geräte wird automatisch um 1 erhöht.
*/
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;//Erhöhung Papieranzahl des Gerätes
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;//Erhöhung Vorgangsanzahl des Gerätes
kopierPapierAnzahlAlle=kopierPapierAnzahlAlle+papierAnzahl;//Erhöhung Papieranzahl aller Geräte
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Erhöhung Vorgangsanzahl aller Geräte
druckeKopierInfos(papierAnzahl);//Methodenaufruf und Parameterweitergabe
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Gerätes
System.out.println("Jetzige Kopien: "+papierAnzahl);//Papieranzahl aus "kopierePapier-Methode"
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);//Summe aller Kopien des Gerätes
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);//Anzahl aller Kopie-Vorgängen des Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public KopierGeraete(String kopiererName) { //Konstruktor erwartet Gerätenamen
this.kopiererName = kopiererName; //Zuweisung der Instanzvariablen
kopierGeraetAnzahl = kopierGeraetAnzahl + 1; //Gerätaanzahl wird erhöht
}
}
Und die Copyshop Klasse mit allen Objekten.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scanvorgänge: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl gescannter Papiere: "+Farbscanner.scannPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Scan "+((double)Farbscanner.scannPapierAnzahlAlle/(double)Farbscanner.scannVorgangAnzahlAlle));
System.out.println("");
System.out.println("Gesamtanzahl Kopiervorgänge: "+KopierGeraete.kopierVorgangAnzahlAlle);
System.out.println("Gesamtanzahl kopierter Papiere: "+KopierGeraete.kopierPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Kopieren "+((double)KopierGeraete.kopierPapierAnzahlAlle/(double)KopierGeraete.kopierVorgangAnzahlAlle));
System.out.println("");
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
scanner2.scannePapier(800);//Methodenaufruf für Scanner 2 mit 800 Blatt
scanner2.scannePapier(20);//Methodenaufruf für Scanner 2 mit 20 Blatt
scanner3.scannePapier(196);//Methodenaufruf für Scanner 3 mit 196 Blatt
scanner3.scannePapier(23);//Methodenaufruf für Scanner 3 mit 23 Blatt
scanner3.scannePapier(34);//Scanner 3 scannt insgesamt dreimal
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
kopierer2.kopierePapier(17);
kopierer2.kopierePapier(4);
kopierer3.kopierePapier(44);
kopierer3.kopierePapier(23);
kopierer1.kopierePapier(195);
gibGesamtBericht();
}
}
Klicke auf „Run“ und folgende Bildschirmanzeige sollte erscheinen:
Scanner: DT84
Jetziger Scan: 200
Summe Papieranzahl: 200
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 200.0
Scanner: DT84
Jetziger Scan: 400
Summe Papieranzahl: 600
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 300.0
Scanner: XS75
Jetziger Scan: 800
Summe Papieranzahl: 800
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 800.0
Scanner: XS75
Jetziger Scan: 20
Summe Papieranzahl: 820
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 410.0
Scanner: 75B
Jetziger Scan: 196
Summe Papieranzahl: 196
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 196.0
Scanner: 75B
Jetziger Scan: 23
Summe Papieranzahl: 219
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 109.5
Scanner: 75B
Jetziger Scan: 34
Summe Papieranzahl: 253
Anzahl Scans: 3
Durchschnitt-Anzahl je Vorgang: 84.33333333333333
Kopierer: JG654
Jetzige Kopien: 8
Summe Papieranzahl: 8
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 8.0
Kopierer: JG654
Jetzige Kopien: 98
Summe Papieranzahl: 106
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 53.0
Kopierer: FP76
Jetzige Kopien: 17
Summe Papieranzahl: 17
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 17.0
Kopierer: FP76
Jetzige Kopien: 4
Summe Papieranzahl: 21
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 10.5
Kopierer: 6534XS
Jetzige Kopien: 44
Summe Papieranzahl: 44
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 44.0
Kopierer: 6534XS
Jetzige Kopien: 23
Summe Papieranzahl: 67
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 33.5
Kopierer: JG654
Jetzige Kopien: 195
Summe Papieranzahl: 301
Anzahl Kopiervorgänge: 3
Durchschnitt-Anzahl je Vorgang: 100.33333333333333
Im Copyshop befinden sich 3 Scanner.
Im Copyshop befinden sich 3 Kopierer.
Im Copyshop befinden sich 6 Geräte.
Gesamtanzahl Scanvorgänge: 7
Gesamtanzahl gescannter Papiere: 1673
Durchschnittliche Papiermenge je Scan 239.0
Gesamtanzahl Kopiervorgänge: 7
Gesamtanzahl kopierter Papiere: 389
Durchschnittliche Papiermenge je Kopieren 55.57142857142857
Na hast du Bock auf mehr Übungen?
Dann schau dir doch meine Übersichtsseite mit den Java Übungen einmal an.
Über den Autor
Folge Sciodoo und bleibe stets auf dem Laufenden. Schließ dich uns an und abonniere unseren Instagram-Kanal ein. Wir stellen täglich neue Artikel für dich rein.
Weiter zum Kanal>>>
Es macht also durchaus Sinn, bei der Erstellung des Objektes den Namen gleich festzulegen.
Der Konstruktor besitzt somit eine Parameterliste, welche den Namen erwartet.
public class Farbscanner {
String scannerName; //Objektvariable vom Datentyyp String
int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer
int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public Farbscanner(String scannerName){ //Konstruktor
this.scannerName=scannerName;//Zuweisung des Scanner-Namens
}
}
public class KopierGeraete {
String kopiererName; //Objektvariable vom Datentyyp String
int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer
int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public KopierGeraete(String kopiererName){ //Konstruktor
this.kopiererName=kopiererName;//Zuweisung des Kopierer-Namens
}
}
Immer wenn ein Objekt erstellt wird, erhöht sich die Geräteanzahl um eins.
Jedes Mal, wenn der Konstruktor aufgerufen wird, wird die Anzahl um eins erhöht.
public class Farbscanner {
String scannerName; //Objektvariable vom Datentyyp String
int scannPapierAnzahl; //Instanzvariable vom Datentyp Integer
int scannVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int scannerGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public Farbscanner(String scannerName){ //Konstruktor
this.scannerName=scannerName;//Zuweisung des Scanner-Namens
scannerGeraetAnzahl=scannerGeraetAnzahl+1;//Scanneranzahl wird bei jedem Aufruf um eins erhöht
}
}
public class KopierGeraete {
String kopiererName; //Objektvariable vom Datentyyp String
int kopierPapierAnzahl; //Instanzvariable vom Datentyp Integer
int kopierVorgangAnzahl; //Instanzvariable vom Datentyp Integer
static int kopierGeraetAnzahl; //Klassenvariable vom Datentyp Integer
public KopierGeraete(String kopiererName){ //Konstruktor
this.kopiererName=kopiererName;//Zuweisung des Kopierer-Namens
kopierGeraetAnzahl=kopierGeraetAnzahl+1;//Kopiereranzahl wird bei jedem Aufruf um eins erhöht
}
}
Ich habe die Namensvergabe dir überlassen.
Du kannst somit die Methode nennen wie du möchtest.
Ich empfehle dir nur eine Verbform zu wählen.
Beispielsweise: „zähleGeraete“ oder „gibAnzahlZurück“ oder Ähnliches.
Ich nenne die Methoden „zaehleGeraete“.
Da diese Methode auf beide Objektklassen zugreift, wird es schwierig sich zu entscheiden, wo du diese implementierst.
Ich implementiere diese direkt in die Programmklasse, also in den Copyshop.
Die Methode wird eine statische Methode sein.
Dies hat den Vorteil, dass ich kein Objekt erzeugen muss, um diese aufzurufen.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl)+" Geräte."));
}
public static void main(String[] args) {
}
}
Die Methode liefert jetzt drei Konsolenausgaben.
- Die Anzahl der Kopierer
- Die Anzahl der Scanner
- Die Summe aller Geräte-Anzahlen
Da die Variablen sich in anderen Klassen befinden, kannst du nicht ohne Weiteres darauf zu greifen.
Du musst zuerst die entsprechende Klasse ausweisen (Farbscanner und KopierGeraete)
Und dann greifst du per Punktnotation auf die Klassenvariablen zu.
Schritt 5: Lass uns die Objekte erstellen und die Geräte zählen
An so einem Punkt macht es Sinn das Ganze zu testen.
Deshalb erstellst du jetzt die ersten Objekte und prüfst ob alles soweit funktioniert.
Dazu rufst du außerdem die „zaehleGeraete-Methode“ auf.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
}
}
Klicke auf „Run“ und schau, was passiert.
Und?
Die Konsole gibt jetzt die Anzahlen der Scanner, Kopierer und Gesamtanzahlen zurück.
Alles gut..
Schritt 6: Lass uns endlich kopieren und scannen
Die Methoden zum Scannen und Kopieren sind objektspezifisch.
Du musst diese deshalb als Objektmethoden implementieren.
Zur Erinnerung:
Die Methoden sollen jeweils eine Papiermenge entgegen nehmen und dann sollen diese objektbezogen summiert werden.
Außerdem sollen die Scann- und auch die Kopiervorgänge je Gerät gezählt werden.
Somit sollten diese Methoden beim Aufruf eine Scann- bzw. Kopieanzahl übergeben bekommen.
Da die Anzahl der kopierten bzw. gescannten Blätter keine Kommazahl sein kann, macht es Sinn einen Integer-Datentypen zu wählen.
Und so sieht dann die Farbscanner- Klasse aus.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um übergebene Anzahl // Papiernzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und analog die Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Bei jedem Scann- oder Kopiervorgang erhöhen die entsprechenden Methoden die Instanzvariablen „scannPapierAnzahl“ und „kopierPapierAnzahl“ um jeweils die Menge, welche du als Parameter übergeben würdest.
Als zweiten Schritt erhöhen die Methoden die Instanzvariablen „kopierVorgangAnzahl“ und „scannVorgangAnzahl“ um jeweils eins.
Schritt 7: Jetzt rufst du die Java Methoden am Objekt auf.
Zurück in die Copyshop-Klasse.
Die Objekte hast du bereits erstellt.
Du kannst jetzt zu jedem Objekt jeweils die Instanzmethoden aufrufen.
Ich mache dies aufgrund der Länge des Code jeweils nur für den ersten Scanner und den ersten Kopierer.
Hier nochmal die Daten:
- Scanner 1- Name: DT84, Scannvorgänge 2, Papiermenge: 200 und 400
- Kopierer1- Name: JG654, Kopiervorgänge2, Papiermenge: 8 und 98
Und los geht’s.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");//Infos
kopierer1.kopierePapier(8);//Methodenaufruf für 8 Blatt kopieren
kopierer1.kopierePapier(98);//Methodenaufruf mit 98 Blatt
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");//infos
}
}
Was jetzt noch blöd ist, sind die Konsolenausgaben.
Bei jedem Scann- oder Kopiervorgang müsstest du diese unter dem Methodenaufruf schreiben.
Außerdem könntest du versehentlich Fehler einbauen.
Du möchtest dir vielleicht Ausgaben zum Scanner3 anzeigen lassen….
In der Anweisung beziehst du dich aber auf Scanner 2.
Ja so etwas passiert.
Wenn du bestimmte Inhalte an verschiedenen Stellen anbietest.
Und diese Inhalt machen eigentlich immer wieder das Gleiche.
Dann lagere so etwas in Methoden aus und biete diese an.
Genau dafür sind Methoden da.
Schritt 8: Die Info-Anzeigen in eine separate Methode auslagern.
Lass uns kurz nachdenken.
Was soll die Methode tun?
Sie soll bei jedem Scan- oder Kopiervorgang Infos herausgeben.
Und zwar soll die Papiermenge, die Summe aller bisherigen Papiermengen und die Anzahl der Scan-bzw. Kopiervorgänge zurückgegeben werden.
Und das Ganze soll objektbezogen sein.
Du brauchst also für die Scanner- und für die Kopierklasse jeweils eine Instanzmethode.
Und so würde diese Methode für den Farbscanner aussehen:
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
}
Die Methode gibt die Werte aller drei Instanzvariablen zurück.
Jetzt benötigt diese Methode noch die durchschnittliche Anzahl gescannter Blätter je Vorgang.
Und dies kannst du berechnen, indem du die Papieranzahl („scannPapierAnzahl“) durch die Vorgangsanzahl („scannVorgangAnzahl“) dividierst.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Anzahl je Vorgang: "+(scannPapierAnzahl/scannVorgangAnzahl)); //Durchschnitt
System.out.println("");//leere Zwischenzeile
}
Da bei einer Division meistens Kommazahlen entstehen, musst du den Datentyp der Instanzvariablen casten.
Sowohl „scannPapierAnzahl“ als auch „scannVorgangAnzahl“ sind beides Integer Datentypen.
Es werden also ganze Zahlen gespeichert und auch zurück gegeben.
Caste beide Datentypen auf double und das Ergebnis ist eine Kommazahl.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));//Durchschnitt als Kommazahl
System.out.println("");//Zwischenzeile
}
Eins fehlt noch.
Du bekommst zwar die Info über die Summe aller gescannten Papiere.
Aber die gescannten Papiere des aktuellen Vorganges bekommst du nicht.
Da die „druckeScannInfos-Methode“ sowieso bei jedem Scanvorgang aufgerufen werden soll, wird der Methodenaufruf in der „scannePapier-Methode“ implementiert.
Und dann kann die „Info-Methode“ auch den Parameter der „scan-Methode“ entgegen nehmen.
Hier ist die Farbscanner-Klasse mit der Info-Methode.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um papierAnzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
druckeScannInfos(papierAnzahl);//Methodenaufruf - der Parameter "papierAnzahl" wird weiter gegeben
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Parameter aus der ScannePapier-Methode
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//leere Zwischenzeile wird eingefügt
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und analog dazu die Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Kopierer
System.out.println("Jetzige Kopien: "+papierAnzahl);//lokale Variable aus kopierePapier-Methode
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl); //Papieranzahl alle Vorgänge
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Zurück zum Copyshop
Jetzt kannst du in der Klasse Copyshop die Bildschirmanzeigen löschen.
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");
Lösche diese beiden Anweisungen und klicke auf „Run“.
Dir werden alle Infos zu den Scan- als auch zu den Kopiervorgängen angezeigt.
Schritt 9: Jetzt noch die Gesamtstatistik
Schau dir die Aufgabenstellung noch einmal an!
- Anzahl der Scannvorgänge je Gerät (mit spezifischen Namen) – erledigt
- Anzahl Kopiervorgänge aller Geräte
- Anzahl der Geräte im Copyshop – erledigt
- Durchschnittliche Anzahl der gescannten Papiere je Vorgang –erledigt
- Durchschnittliche Anzahl der Kopien je Kopiergerät
Beginne mit der Anzahl der Kopiervorgänge über alle Geräte.
Zur Erinnerung. Dir werden zur Zeit nur die Vorgänge je Gerät angezeigt.
Damit du alle Vorgänge speichern kannst, brauchst du eine neue Variable.
Und zwar wieder eine Klassenvariable.
Lege also jeweils eine Variable „scannVorgangAnzahlAlle“ und „kopierVorgangAnzahlAlle“ in den jeweiligen Klassen an.
Da sich die Variablen mit jedem Scan- oder Kopiervorgang um jeweils eins erhöhen, implementiere das Ganze in die entsprechenden Methoden.
Und so sieht das Ganze in der Farbscanner-Klasse aus.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl;
int scannVorgangAnzahl;
static int scannerGeraetAnzahl;
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scans um 1
druckeScannInfos(papierAnzahl);
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName);
System.out.println("Jetziger Scan: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");
}
public Farbscanner(String scannerName) {
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und wieder analog in Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl;
int kopierVorgangAnzahl;
static int kopierGeraetAnzahl;
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Kopierer
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Kopiervorgänge aller Kopierer wird erhöht
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName);
System.out.println("Jetzige Kopien: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");
}
public KopierGeraete(String kopiererName) {
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Und in der Copyshop-Klasse bietest du eine Methode an, welche diese Werte ausgibt.
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
Da du in der Methode wieder eine Klassenvariable aufrufst, musst du die entsprechende Klasse explizit ausweisen.
Und dann kannst du per Punktnotation auf diese Variable zugreifen.
Da die Gesamtanzahl der Geräte auch nur ein Teil des Gesamtberichtes ist, kannst du den Methodenaufruf in der „gibGesamtBericht-Methode“ implementieren.
Dadurch musst du diese Methode nicht mehr innerhalb der main -Methode aufrufen.
So sieht die Klasse Copyshop jetzt aus.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");
Farbscanner scanner3 = new Farbscanner ("75B");
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76");
KopierGeraete kopierer3 = new KopierGeraete("6534XS");
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
gibGesamtBericht();
}
}
Jetzt kennst du die Anzahl aller Kopiervorgänge je Gerät.
Aber du kennst jetzt auch die Summe aller Kopiervorgänge aller Geräte.
Und das Selbe gilt für die Farbscanner.
Wenn Du jetzt noch Bock hast, kannst du dir natürlich noch
- die Anzahl aller kopierten Blätter über allen Geräten
- die Anzahl aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller kopierten Dokumente über alle Kopierer
anzeigen lassen.
Weil es ganz schön viel war – Hier der komplette Code zu dieser Java Übung
Die Farbscanner Klasse komplett:
public class Farbscanner {
String scannerName; //Name des Scanners
int scannPapierAnzahl; //gescannte Papiere je Scanner
int scannVorgangAnzahl; //Scanvorgänge je Scanner
static int scannerGeraetAnzahl; //Anzahl aller Scann-Geräte
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
static int scannPapierAnzahlAlle; //speichert alle gescannten Papiere aller Scanner
/*
* Die Scanne-Papier-Methode erwartet einen Parameter beim Aufruf.
* Dieser Wert erhöht die Instanzvariable gerätespezifische Papieranzahl ("scannPapierAnzahl").
* Dieser Wert erhöht auch die Papieranzahl aller Scangeräte ("scannPapierAnzahlAlle").
* Die Anzahl der geräteabhängigen Scannvorgänge wird automatisch um 1 erhöht.
* Die Anzahl der Scanvorgänge aller Geräte wird automatisch um 1 erhöht.
*/
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;//Papieranzahl Gerät wird erhöht
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;//Scanvorgang je Gerät wird um 1 erhöht
scannPapierAnzahlAlle=scannPapierAnzahlAlle+papierAnzahl;//Papieranzahl aller Scan-Geräte wird erhöht
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scanvorgänge aller Geräte um 1
druckeScannInfos(papierAnzahl); //Methodenaufruf und Parameterweitergabe
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Übernahme aus "scannePapier-Methode"
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);//Papieranzahl aller Scans dieses Gerätes
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Vorgangsanzahl aller Scans dieses Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public Farbscanner(String scannerName) { //Konstruktor erwartet den Namen beim Aufruf
this.scannerName = scannerName; //Zuweisung der Instanzvariable
scannerGeraetAnzahl = scannerGeraetAnzahl + 1; //Geräteanzahl wird erhöht
}
}
Die Kopiergeräte-Klasse komplett
public class KopierGeraete {
String kopiererName; //Name des Kopierers
int kopierPapierAnzahl; //kopierte Anzahl je Gerät
int kopierVorgangAnzahl; //Kopiervorgänge je Gerät
static int kopierGeraetAnzahl; //Anzahl Kopiergeräte
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Geräte
static int kopierPapierAnzahlAlle;//Speichert alle kopierten Papierer aller Geräte
/*
* Die "kopierePapier-Methode" erwartet beim Aufruf einen Paremeter.
* Um diesen Wert wird die gerätespezifische Instanzvariable "kopierPapierAnzahl" erhöht.
* Außerdem wird der Wert aller Kopiergeräte erhöht ("kopierPapierAnzahlAlle").
* Die Vorgangsanzahl des Gerätes wird automatisch um 1 erhöht.
* Die Vorgangsanzahl aller Geräte wird automatisch um 1 erhöht.
*/
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;//Erhöhung Papieranzahl des Gerätes
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;//Erhöhung Vorgangsanzahl des Gerätes
kopierPapierAnzahlAlle=kopierPapierAnzahlAlle+papierAnzahl;//Erhöhung Papieranzahl aller Geräte
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Erhöhung Vorgangsanzahl aller Geräte
druckeKopierInfos(papierAnzahl);//Methodenaufruf und Parameterweitergabe
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Gerätes
System.out.println("Jetzige Kopien: "+papierAnzahl);//Papieranzahl aus "kopierePapier-Methode"
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);//Summe aller Kopien des Gerätes
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);//Anzahl aller Kopie-Vorgängen des Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public KopierGeraete(String kopiererName) { //Konstruktor erwartet Gerätenamen
this.kopiererName = kopiererName; //Zuweisung der Instanzvariablen
kopierGeraetAnzahl = kopierGeraetAnzahl + 1; //Gerätaanzahl wird erhöht
}
}
Und die Copyshop Klasse mit allen Objekten.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scanvorgänge: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl gescannter Papiere: "+Farbscanner.scannPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Scan "+((double)Farbscanner.scannPapierAnzahlAlle/(double)Farbscanner.scannVorgangAnzahlAlle));
System.out.println("");
System.out.println("Gesamtanzahl Kopiervorgänge: "+KopierGeraete.kopierVorgangAnzahlAlle);
System.out.println("Gesamtanzahl kopierter Papiere: "+KopierGeraete.kopierPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Kopieren "+((double)KopierGeraete.kopierPapierAnzahlAlle/(double)KopierGeraete.kopierVorgangAnzahlAlle));
System.out.println("");
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
scanner2.scannePapier(800);//Methodenaufruf für Scanner 2 mit 800 Blatt
scanner2.scannePapier(20);//Methodenaufruf für Scanner 2 mit 20 Blatt
scanner3.scannePapier(196);//Methodenaufruf für Scanner 3 mit 196 Blatt
scanner3.scannePapier(23);//Methodenaufruf für Scanner 3 mit 23 Blatt
scanner3.scannePapier(34);//Scanner 3 scannt insgesamt dreimal
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
kopierer2.kopierePapier(17);
kopierer2.kopierePapier(4);
kopierer3.kopierePapier(44);
kopierer3.kopierePapier(23);
kopierer1.kopierePapier(195);
gibGesamtBericht();
}
}
Klicke auf „Run“ und folgende Bildschirmanzeige sollte erscheinen:
Scanner: DT84
Jetziger Scan: 200
Summe Papieranzahl: 200
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 200.0
Scanner: DT84
Jetziger Scan: 400
Summe Papieranzahl: 600
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 300.0
Scanner: XS75
Jetziger Scan: 800
Summe Papieranzahl: 800
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 800.0
Scanner: XS75
Jetziger Scan: 20
Summe Papieranzahl: 820
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 410.0
Scanner: 75B
Jetziger Scan: 196
Summe Papieranzahl: 196
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 196.0
Scanner: 75B
Jetziger Scan: 23
Summe Papieranzahl: 219
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 109.5
Scanner: 75B
Jetziger Scan: 34
Summe Papieranzahl: 253
Anzahl Scans: 3
Durchschnitt-Anzahl je Vorgang: 84.33333333333333
Kopierer: JG654
Jetzige Kopien: 8
Summe Papieranzahl: 8
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 8.0
Kopierer: JG654
Jetzige Kopien: 98
Summe Papieranzahl: 106
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 53.0
Kopierer: FP76
Jetzige Kopien: 17
Summe Papieranzahl: 17
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 17.0
Kopierer: FP76
Jetzige Kopien: 4
Summe Papieranzahl: 21
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 10.5
Kopierer: 6534XS
Jetzige Kopien: 44
Summe Papieranzahl: 44
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 44.0
Kopierer: 6534XS
Jetzige Kopien: 23
Summe Papieranzahl: 67
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 33.5
Kopierer: JG654
Jetzige Kopien: 195
Summe Papieranzahl: 301
Anzahl Kopiervorgänge: 3
Durchschnitt-Anzahl je Vorgang: 100.33333333333333
Im Copyshop befinden sich 3 Scanner.
Im Copyshop befinden sich 3 Kopierer.
Im Copyshop befinden sich 6 Geräte.
Gesamtanzahl Scanvorgänge: 7
Gesamtanzahl gescannter Papiere: 1673
Durchschnittliche Papiermenge je Scan 239.0
Gesamtanzahl Kopiervorgänge: 7
Gesamtanzahl kopierter Papiere: 389
Durchschnittliche Papiermenge je Kopieren 55.57142857142857
Na hast du Bock auf mehr Übungen?
Dann schau dir doch meine Übersichtsseite mit den Java Übungen einmal an.
Über den Autor
Folge Sciodoo und bleibe stets auf dem Laufenden. Schließ dich uns an und abonniere unseren Instagram-Kanal ein. Wir stellen täglich neue Artikel für dich rein.
Weiter zum Kanal>>>
Dazu rufst du außerdem die „zaehleGeraete-Methode“ auf.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
}
}
Die Konsole gibt jetzt die Anzahlen der Scanner, Kopierer und Gesamtanzahlen zurück.
Die Methoden sollen jeweils eine Papiermenge entgegen nehmen und dann sollen diese objektbezogen summiert werden.
Außerdem sollen die Scann- und auch die Kopiervorgänge je Gerät gezählt werden.
Da die Anzahl der kopierten bzw. gescannten Blätter keine Kommazahl sein kann, macht es Sinn einen Integer-Datentypen zu wählen.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um übergebene Anzahl // Papiernzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Zurück in die Copyshop-Klasse.
Die Objekte hast du bereits erstellt.
Du kannst jetzt zu jedem Objekt jeweils die Instanzmethoden aufrufen.
Ich mache dies aufgrund der Länge des Code jeweils nur für den ersten Scanner und den ersten Kopierer.
Hier nochmal die Daten:
- Scanner 1- Name: DT84, Scannvorgänge 2, Papiermenge: 200 und 400
- Kopierer1- Name: JG654, Kopiervorgänge2, Papiermenge: 8 und 98
Und los geht’s.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
zaehleGeraete(); //Aufruf der statischen Zählen Methode
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");//Infos
kopierer1.kopierePapier(8);//Methodenaufruf für 8 Blatt kopieren
kopierer1.kopierePapier(98);//Methodenaufruf mit 98 Blatt
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");//infos
}
}
Was jetzt noch blöd ist, sind die Konsolenausgaben.
Bei jedem Scann- oder Kopiervorgang müsstest du diese unter dem Methodenaufruf schreiben.
Außerdem könntest du versehentlich Fehler einbauen.
Du möchtest dir vielleicht Ausgaben zum Scanner3 anzeigen lassen….
In der Anweisung beziehst du dich aber auf Scanner 2.
Ja so etwas passiert.
Wenn du bestimmte Inhalte an verschiedenen Stellen anbietest.
Und diese Inhalt machen eigentlich immer wieder das Gleiche.
Dann lagere so etwas in Methoden aus und biete diese an.
Genau dafür sind Methoden da.
Schritt 8: Die Info-Anzeigen in eine separate Methode auslagern.
Lass uns kurz nachdenken.
Was soll die Methode tun?
Sie soll bei jedem Scan- oder Kopiervorgang Infos herausgeben.
Und zwar soll die Papiermenge, die Summe aller bisherigen Papiermengen und die Anzahl der Scan-bzw. Kopiervorgänge zurückgegeben werden.
Und das Ganze soll objektbezogen sein.
Du brauchst also für die Scanner- und für die Kopierklasse jeweils eine Instanzmethode.
Und so würde diese Methode für den Farbscanner aussehen:
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
}
Die Methode gibt die Werte aller drei Instanzvariablen zurück.
Jetzt benötigt diese Methode noch die durchschnittliche Anzahl gescannter Blätter je Vorgang.
Und dies kannst du berechnen, indem du die Papieranzahl („scannPapierAnzahl“) durch die Vorgangsanzahl („scannVorgangAnzahl“) dividierst.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Anzahl je Vorgang: "+(scannPapierAnzahl/scannVorgangAnzahl)); //Durchschnitt
System.out.println("");//leere Zwischenzeile
}
Da bei einer Division meistens Kommazahlen entstehen, musst du den Datentyp der Instanzvariablen casten.
Sowohl „scannPapierAnzahl“ als auch „scannVorgangAnzahl“ sind beides Integer Datentypen.
Es werden also ganze Zahlen gespeichert und auch zurück gegeben.
Caste beide Datentypen auf double und das Ergebnis ist eine Kommazahl.
void druckeScannInfos(){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));//Durchschnitt als Kommazahl
System.out.println("");//Zwischenzeile
}
Eins fehlt noch.
Du bekommst zwar die Info über die Summe aller gescannten Papiere.
Aber die gescannten Papiere des aktuellen Vorganges bekommst du nicht.
Da die „druckeScannInfos-Methode“ sowieso bei jedem Scanvorgang aufgerufen werden soll, wird der Methodenaufruf in der „scannePapier-Methode“ implementiert.
Und dann kann die „Info-Methode“ auch den Parameter der „scan-Methode“ entgegen nehmen.
Hier ist die Farbscanner-Klasse mit der Info-Methode.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl; // Anzahl der gescannten Blätter
int scannVorgangAnzahl; // Anzahl der Scann-Vorgänge
static int scannerGeraetAnzahl;
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;// Erhöhung um papierAnzahl
this.scannVorgangAnzahl = scannVorgangAnzahl + 1; // Erhöhung um 1
druckeScannInfos(papierAnzahl);//Methodenaufruf - der Parameter "papierAnzahl" wird weiter gegeben
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Parameter aus der ScannePapier-Methode
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl); //Papieranzahl alle Scans
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//leere Zwischenzeile wird eingefügt
}
public Farbscanner(String scannerName) { // Konstruktor
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und analog dazu die Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl; // Anzahl der kopierten Blätter
int kopierVorgangAnzahl; // Anzahl der Kopiervorgänge
static int kopierGeraetAnzahl;
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;// Erhöhung um Papieranzahl
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1; // Erhöhung um 1
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Kopierer
System.out.println("Jetzige Kopien: "+papierAnzahl);//lokale Variable aus kopierePapier-Methode
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl); //Papieranzahl alle Vorgänge
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl); //Anzahl Vorgänge
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile
}
public KopierGeraete(String kopiererName) { // Konstruktor
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Zurück zum Copyshop
Jetzt kannst du in der Klasse Copyshop die Bildschirmanzeigen löschen.
System.out.println("Scanner "+scanner1.scannerName+":"+scanner1.scannPapierAnzahl+" Blatt");
System.out.println("Kopierer "+kopierer1.kopiererName+":"+kopierer1.kopierPapierAnzahl+" Blatt");
Lösche diese beiden Anweisungen und klicke auf „Run“.
Dir werden alle Infos zu den Scan- als auch zu den Kopiervorgängen angezeigt.
Schritt 9: Jetzt noch die Gesamtstatistik
Schau dir die Aufgabenstellung noch einmal an!
- Anzahl der Scannvorgänge je Gerät (mit spezifischen Namen) – erledigt
- Anzahl Kopiervorgänge aller Geräte
- Anzahl der Geräte im Copyshop – erledigt
- Durchschnittliche Anzahl der gescannten Papiere je Vorgang –erledigt
- Durchschnittliche Anzahl der Kopien je Kopiergerät
Beginne mit der Anzahl der Kopiervorgänge über alle Geräte.
Zur Erinnerung. Dir werden zur Zeit nur die Vorgänge je Gerät angezeigt.
Damit du alle Vorgänge speichern kannst, brauchst du eine neue Variable.
Und zwar wieder eine Klassenvariable.
Lege also jeweils eine Variable „scannVorgangAnzahlAlle“ und „kopierVorgangAnzahlAlle“ in den jeweiligen Klassen an.
Da sich die Variablen mit jedem Scan- oder Kopiervorgang um jeweils eins erhöhen, implementiere das Ganze in die entsprechenden Methoden.
Und so sieht das Ganze in der Farbscanner-Klasse aus.
public class Farbscanner {
String scannerName;
int scannPapierAnzahl;
int scannVorgangAnzahl;
static int scannerGeraetAnzahl;
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scans um 1
druckeScannInfos(papierAnzahl);
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName);
System.out.println("Jetziger Scan: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);
System.out.println("Anzahl Scans: "+scannVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");
}
public Farbscanner(String scannerName) {
this.scannerName = scannerName;
scannerGeraetAnzahl = scannerGeraetAnzahl + 1;
}
}
Und wieder analog in Kopierer-Klasse.
public class KopierGeraete {
String kopiererName;
int kopierPapierAnzahl;
int kopierVorgangAnzahl;
static int kopierGeraetAnzahl;
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Kopierer
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Kopiervorgänge aller Kopierer wird erhöht
druckeKopierInfos(papierAnzahl);
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName);
System.out.println("Jetzige Kopien: "+papierAnzahl);
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");
}
public KopierGeraete(String kopiererName) {
this.kopiererName = kopiererName;
kopierGeraetAnzahl = kopierGeraetAnzahl + 1;
}
}
Und in der Copyshop-Klasse bietest du eine Methode an, welche diese Werte ausgibt.
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
Da du in der Methode wieder eine Klassenvariable aufrufst, musst du die entsprechende Klasse explizit ausweisen.
Und dann kannst du per Punktnotation auf diese Variable zugreifen.
Da die Gesamtanzahl der Geräte auch nur ein Teil des Gesamtberichtes ist, kannst du den Methodenaufruf in der „gibGesamtBericht-Methode“ implementieren.
Dadurch musst du diese Methode nicht mehr innerhalb der main -Methode aufrufen.
So sieht die Klasse Copyshop jetzt aus.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scans: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl Kopieren: "+KopierGeraete.kopierVorgangAnzahlAlle);
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");
Farbscanner scanner3 = new Farbscanner ("75B");
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76");
KopierGeraete kopierer3 = new KopierGeraete("6534XS");
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
gibGesamtBericht();
}
}
Jetzt kennst du die Anzahl aller Kopiervorgänge je Gerät.
Aber du kennst jetzt auch die Summe aller Kopiervorgänge aller Geräte.
Und das Selbe gilt für die Farbscanner.
Wenn Du jetzt noch Bock hast, kannst du dir natürlich noch
- die Anzahl aller kopierten Blätter über allen Geräten
- die Anzahl aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller gescannten Dokumenten über allen Geräten
- den Durchschnitt aller kopierten Dokumente über alle Kopierer
anzeigen lassen.
Weil es ganz schön viel war – Hier der komplette Code zu dieser Java Übung
Die Farbscanner Klasse komplett:
public class Farbscanner {
String scannerName; //Name des Scanners
int scannPapierAnzahl; //gescannte Papiere je Scanner
int scannVorgangAnzahl; //Scanvorgänge je Scanner
static int scannerGeraetAnzahl; //Anzahl aller Scann-Geräte
static int scannVorgangAnzahlAlle;//speichert Scans von allen Geräten
static int scannPapierAnzahlAlle; //speichert alle gescannten Papiere aller Scanner
/*
* Die Scanne-Papier-Methode erwartet einen Parameter beim Aufruf.
* Dieser Wert erhöht die Instanzvariable gerätespezifische Papieranzahl ("scannPapierAnzahl").
* Dieser Wert erhöht auch die Papieranzahl aller Scangeräte ("scannPapierAnzahlAlle").
* Die Anzahl der geräteabhängigen Scannvorgänge wird automatisch um 1 erhöht.
* Die Anzahl der Scanvorgänge aller Geräte wird automatisch um 1 erhöht.
*/
public void scannePapier(int papierAnzahl) {
this.scannPapierAnzahl = scannPapierAnzahl + papierAnzahl;//Papieranzahl Gerät wird erhöht
this.scannVorgangAnzahl = scannVorgangAnzahl + 1;//Scanvorgang je Gerät wird um 1 erhöht
scannPapierAnzahlAlle=scannPapierAnzahlAlle+papierAnzahl;//Papieranzahl aller Scan-Geräte wird erhöht
scannVorgangAnzahlAlle=scannVorgangAnzahlAlle+1;//Erhöhung aller Scanvorgänge aller Geräte um 1
druckeScannInfos(papierAnzahl); //Methodenaufruf und Parameterweitergabe
}
void druckeScannInfos(int papierAnzahl){
System.out.println("Scanner: "+scannerName); //Name des Scanners
System.out.println("Jetziger Scan: "+papierAnzahl);//Übernahme aus "scannePapier-Methode"
System.out.println("Summe Papieranzahl: "+scannPapierAnzahl);//Papieranzahl aller Scans dieses Gerätes
System.out.println("Anzahl Scans: "+scannVorgangAnzahl); //Vorgangsanzahl aller Scans dieses Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)scannPapierAnzahl/(double)scannVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public Farbscanner(String scannerName) { //Konstruktor erwartet den Namen beim Aufruf
this.scannerName = scannerName; //Zuweisung der Instanzvariable
scannerGeraetAnzahl = scannerGeraetAnzahl + 1; //Geräteanzahl wird erhöht
}
}
Die Kopiergeräte-Klasse komplett
public class KopierGeraete {
String kopiererName; //Name des Kopierers
int kopierPapierAnzahl; //kopierte Anzahl je Gerät
int kopierVorgangAnzahl; //Kopiervorgänge je Gerät
static int kopierGeraetAnzahl; //Anzahl Kopiergeräte
static int kopierVorgangAnzahlAlle; //Speichert alle Kopiervorgänge über alle Geräte
static int kopierPapierAnzahlAlle;//Speichert alle kopierten Papierer aller Geräte
/*
* Die "kopierePapier-Methode" erwartet beim Aufruf einen Paremeter.
* Um diesen Wert wird die gerätespezifische Instanzvariable "kopierPapierAnzahl" erhöht.
* Außerdem wird der Wert aller Kopiergeräte erhöht ("kopierPapierAnzahlAlle").
* Die Vorgangsanzahl des Gerätes wird automatisch um 1 erhöht.
* Die Vorgangsanzahl aller Geräte wird automatisch um 1 erhöht.
*/
public void kopierePapier(int papierAnzahl) {
this.kopierPapierAnzahl = kopierPapierAnzahl + papierAnzahl;//Erhöhung Papieranzahl des Gerätes
this.kopierVorgangAnzahl = kopierVorgangAnzahl + 1;//Erhöhung Vorgangsanzahl des Gerätes
kopierPapierAnzahlAlle=kopierPapierAnzahlAlle+papierAnzahl;//Erhöhung Papieranzahl aller Geräte
kopierVorgangAnzahlAlle=kopierVorgangAnzahlAlle+1;//Erhöhung Vorgangsanzahl aller Geräte
druckeKopierInfos(papierAnzahl);//Methodenaufruf und Parameterweitergabe
}
void druckeKopierInfos(int papierAnzahl){
System.out.println("Kopierer: "+kopiererName); //Name des Gerätes
System.out.println("Jetzige Kopien: "+papierAnzahl);//Papieranzahl aus "kopierePapier-Methode"
System.out.println("Summe Papieranzahl: "+kopierPapierAnzahl);//Summe aller Kopien des Gerätes
System.out.println("Anzahl Kopiervorgänge: "+kopierVorgangAnzahl);//Anzahl aller Kopie-Vorgängen des Gerätes
System.out.println("Durchschnitt-Anzahl je Vorgang: "+((double)kopierPapierAnzahl/(double)kopierVorgangAnzahl));
System.out.println("");//Zwischenzeile zur besseren Abgrenzung
}
public KopierGeraete(String kopiererName) { //Konstruktor erwartet Gerätenamen
this.kopiererName = kopiererName; //Zuweisung der Instanzvariablen
kopierGeraetAnzahl = kopierGeraetAnzahl + 1; //Gerätaanzahl wird erhöht
}
}
Und die Copyshop Klasse mit allen Objekten.
public class CopyShop {
static void zaehleGeraete (){ //Gibt Infos zu den Geräte-Anzahlen
System.out.println("Im Copyshop befinden sich "+Farbscanner.scannerGeraetAnzahl+ " Scanner.");
System.out.println("Im Copyshop befinden sich "+KopierGeraete.kopierGeraetAnzahl+ " Kopierer.");
System.out.println("Im Copyshop befinden sich "+(Farbscanner.scannerGeraetAnzahl+KopierGeraete.kopierGeraetAnzahl+" Geräte."));
}
static void gibGesamtBericht() {
zaehleGeraete();
System.out.println("Gesamtanzahl Scanvorgänge: "+Farbscanner.scannVorgangAnzahlAlle);
System.out.println("Gesamtanzahl gescannter Papiere: "+Farbscanner.scannPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Scan "+((double)Farbscanner.scannPapierAnzahlAlle/(double)Farbscanner.scannVorgangAnzahlAlle));
System.out.println("");
System.out.println("Gesamtanzahl Kopiervorgänge: "+KopierGeraete.kopierVorgangAnzahlAlle);
System.out.println("Gesamtanzahl kopierter Papiere: "+KopierGeraete.kopierPapierAnzahlAlle);
System.out.println("Durchschnittliche Papiermenge je Kopieren "+((double)KopierGeraete.kopierPapierAnzahlAlle/(double)KopierGeraete.kopierVorgangAnzahlAlle));
System.out.println("");
}
public static void main(String[] args) {
Farbscanner scanner1 = new Farbscanner ("DT84"); //neuer Scanner
Farbscanner scanner2 = new Farbscanner ("XS75");//noch ein Scanner
Farbscanner scanner3 = new Farbscanner ("75B"); //und noch einer
KopierGeraete kopierer1 = new KopierGeraete("JG654"); //der erste Kopierer
KopierGeraete kopierer2 = new KopierGeraete("FP76"); //noch ein Kopierer
KopierGeraete kopierer3 = new KopierGeraete("6534XS"); //der dritte Kopierer
scanner1.scannePapier(200);//Methodenaufruf mit 200 Blatt
scanner1.scannePapier(400);//Methodenaufruf mit 400 Blatt
scanner2.scannePapier(800);//Methodenaufruf für Scanner 2 mit 800 Blatt
scanner2.scannePapier(20);//Methodenaufruf für Scanner 2 mit 20 Blatt
scanner3.scannePapier(196);//Methodenaufruf für Scanner 3 mit 196 Blatt
scanner3.scannePapier(23);//Methodenaufruf für Scanner 3 mit 23 Blatt
scanner3.scannePapier(34);//Scanner 3 scannt insgesamt dreimal
kopierer1.kopierePapier(8);
kopierer1.kopierePapier(98);
kopierer2.kopierePapier(17);
kopierer2.kopierePapier(4);
kopierer3.kopierePapier(44);
kopierer3.kopierePapier(23);
kopierer1.kopierePapier(195);
gibGesamtBericht();
}
}
Klicke auf „Run“ und folgende Bildschirmanzeige sollte erscheinen:
Scanner: DT84
Jetziger Scan: 200
Summe Papieranzahl: 200
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 200.0
Scanner: DT84
Jetziger Scan: 400
Summe Papieranzahl: 600
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 300.0
Scanner: XS75
Jetziger Scan: 800
Summe Papieranzahl: 800
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 800.0
Scanner: XS75
Jetziger Scan: 20
Summe Papieranzahl: 820
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 410.0
Scanner: 75B
Jetziger Scan: 196
Summe Papieranzahl: 196
Anzahl Scans: 1
Durchschnitt-Anzahl je Vorgang: 196.0
Scanner: 75B
Jetziger Scan: 23
Summe Papieranzahl: 219
Anzahl Scans: 2
Durchschnitt-Anzahl je Vorgang: 109.5
Scanner: 75B
Jetziger Scan: 34
Summe Papieranzahl: 253
Anzahl Scans: 3
Durchschnitt-Anzahl je Vorgang: 84.33333333333333
Kopierer: JG654
Jetzige Kopien: 8
Summe Papieranzahl: 8
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 8.0
Kopierer: JG654
Jetzige Kopien: 98
Summe Papieranzahl: 106
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 53.0
Kopierer: FP76
Jetzige Kopien: 17
Summe Papieranzahl: 17
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 17.0
Kopierer: FP76
Jetzige Kopien: 4
Summe Papieranzahl: 21
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 10.5
Kopierer: 6534XS
Jetzige Kopien: 44
Summe Papieranzahl: 44
Anzahl Kopiervorgänge: 1
Durchschnitt-Anzahl je Vorgang: 44.0
Kopierer: 6534XS
Jetzige Kopien: 23
Summe Papieranzahl: 67
Anzahl Kopiervorgänge: 2
Durchschnitt-Anzahl je Vorgang: 33.5
Kopierer: JG654
Jetzige Kopien: 195
Summe Papieranzahl: 301
Anzahl Kopiervorgänge: 3
Durchschnitt-Anzahl je Vorgang: 100.33333333333333
Im Copyshop befinden sich 3 Scanner.
Im Copyshop befinden sich 3 Kopierer.
Im Copyshop befinden sich 6 Geräte.
Gesamtanzahl Scanvorgänge: 7
Gesamtanzahl gescannter Papiere: 1673
Durchschnittliche Papiermenge je Scan 239.0
Gesamtanzahl Kopiervorgänge: 7
Gesamtanzahl kopierter Papiere: 389
Durchschnittliche Papiermenge je Kopieren 55.57142857142857
Na hast du Bock auf mehr Übungen?
Dann schau dir doch meine Übersichtsseite mit den Java Übungen einmal an.