Skip to main content

Java Übung – Bau dir deinen eigenen Copyshop

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

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.


Ähnliche Beiträge

So kannst du Java Arrays anlegen

Java Arrays anlegen

Java Arrays– Was ist das? Stell es dir einmal als ein Bücherregal vor. In einem Bücherregal befinden sich sämtliche Bücher. Und diese befinden sich schön nebeneinander. Jedes Buch hat seinen festen Platz. Du kannst die Bücher ganz genau lokalisieren. Zum Beispiel kannst du sagen. Das erste Buch von links Das dritte von rechts usw. Und […]

So kannst du Java Konstanten bei der Programmierung nutzen

Java Konstanten – was kann man sich darunter vorstellen? Du kennst Konstanten in der Mathematik. Die Kreiszahl Pi ist so eine konstante Zahl. Diese Zahl ändert sich niemals. Sie beträgt immer rund 3,141592. In der Physik gelten die Lichtgeschwindigkeit, der Erdradius oder der absolute Nullpunkt als konstant. Selbst die Geschwindigkeit mit der sich die Erde […]

So verwendest du Inkrement und Dekrement Operatoren in deinen Java Programmen

Java Operatoren

In diesem Beitrag geht es um Java Operatoren. Ich möchte dir gern zwei neue Operatoren vorstellen. Diese nennen sich Inkrement und Dekrement. Ja was heißt das? Inkrementieren bedeutet eine schrittweise Erhöhung einer Zahl. Und dementsprechend bedeutet Dekrementieren: Die schrittweise Verminderung einer Zahl. Wozu brauchst du das? Stell dir vor. Du bekommst eine Liste mit Namen […]

Java Exklusives Oder – So nutzt du den Xor Operator

Java exklusives oder

In diesem Beitrag möchte ich dir den Xor Operator von Java vorstellen. Dieser Operator wird auch als ausschließendes oder exklusives Oder bezeichnet. Ein Beispiel: Was wilst du heute zum Mittag essen: Fleisch oder Fisch? Auf diese Frage gibt es nur eine Antwort. Es ist entweder Fisch oder Fleisch. Niemals beides. Das Eine schließt das andere […]

So verwendest du den Java Oder Operator

Java Oder Operator

Kennst du das auch aus deiner Schulzeit? Du schreibst eine Klassenarbeit in irgendeinem Fach. Nehmen wir einfach mal an – Mathe. Jetzt bist gerade fertig mit deiner Arbeit. Und zu Hause wirst du gefragt: „Und wie lief es?“ Du antwortet:“ Ganz gut. Es wird bestimmt eine Eins oder eine Zwei.“ Drei oder vier Tage später […]

Java Exceptions Handling – Fehler- und Ausnahmenbehandlung in Java

Java Exceptions Handling

Java Exceptions Handling umfasst den richtigen Umgang mit Ausnahmen und Fehlern. Wie geht das? Und braucht man so etwas wirklich? Vielleicht sagst du jetzt: „Brauch ich nicht. Ich mache niemals Fehler.“ Doch… Bei der Java Fehlerbehandlung geht es nicht ausschließlich nur um deine Programmierfehler. Es geht auch um falsche Nutzereingaben, Hardware- und Ablauffehler. Und deshalb […]

Drei Möglichkeiten um Java Objekte zu zerstören

Java Objekte zerstören

Java Objekte leben genau solange, wie eine Referenzvariable auf sie zeigt. Wenn dieser Zeiger nicht mehr existiert, wird dieses Objekt aufgeben. Und wenn dieses Objekt erst einmal aufgegeben wurde, dann kommt der Garbage Collector und entsorgt dieses. Aber wie kannst du nun am Sinnvollsten Objekte aufgeben? Lass es uns herausfinden.

So verwendest du in Java try und catch Blöcke

Java try und catch

Ich bereue lieber die Dinge, die ich getan habe – als die Dinge, welche ich gar nicht erst versucht habe. Ja ich würde mich als den typischen „try-and-error-Menschen“ bezeichnen. Was ich will, probiere ich einfach aus und schaue dann erst was passiert. So etwas wie Pläne kenne ich eigentlich nicht. Und wenn ich mal einen […]

Der Aufbau von Java Klassen

Java Klassen Aufbau

Jedes Java Programm besteht aus Java Klassen. Doch wie sind diese aufgebaut? Wie setzt sich die Struktur zusammen? Wo befinden sich Klassen hierarchisch? Was kommt in die Klassen rein und wie wird es integriert? Das sind die Fragen, welche ich in diesem Artikel beantworten werde. Doch bevor wir bei den Klassen ansetzen, müssen wir eine […]