Skip to main content

Java Übung & Lösung zum Umgang mit Instanz- und Klassenmethoden


java programmierung übung lösung  instanzmethoden 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

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

Java Anfänger Übung: Hello World

Java-Übung-Hello-World

Alles beginnt mit „Hello World“. Sämtliche Java Bücher beginnen mit diesem ersten Beispiel. Auch die Java Übungen sollen mit diesem ersten Programm starten. Definiere eine Klasse „Hello World“. Implementiere die Main Methode. Die Main Methode soll bei Programmaufruf die Bildschirmanzeige „Hallo Welt“ zurückgeben. Die Lösung zur Java Übung „Hallo Welt“ […]

Java Übung & Lösung: Bestimme die Anzahl der Tage

java übung lösung tage berechnen

In dieser Java Übung möchte ich, dass du eine Methode schreibst, welche zwei Zahlen entgegennimmt. Und zwar soll die erste Zahl das Jahr sein. Die zweite Zahl soll eine Monatsangabe (1-12) repräsentieren. Was soll die Methode dann machen? Die Methode soll dir die Anzahl der Tage des jeweiligen Monats zurückgeben. […]

Java Übung & Lösung: Das erste kleine Java Spiel

java übung lösung javaspiel

In dieser Java Übung geht es darum ein kleines Java-Spiel zu erstellen. Und zwar Zahlen raten. Was kannst du dir darunter vorstellen? Du gibst einen bestimmten Wertebereich an. Zum Beispiel 0 bis 100. Und das Java Programm erstellt eine Zufallszahl in diesem Bereich. Dann fordert dich das Programm auf, die […]

Java Übung & Lösung: Bestimme den größten gemeinsamen Teiler

java übung lösung größten gemeinsamen teiler bestimmen

In dieser Java Übung möchte ich, dass du den größten gemeinsamen Teiler zwei Zahlen ermittelst. Ich möchte, dass du das Ganze mit einer while-Schleife umsetzt. Und wie? Du legst eine neue Klasse „GGT“ (größter gemeinsamer Teiler) an. In diese Klasse implementierst du eine Klassenmethode „berechneGGT“. Diese erwartet zwei Argumente vom […]

So nutzt du Methoden aus der Java String Klasse

java programmierung methoden java string klasse

In einen der letzten Beiträge haben wir darüber gesprochen, dass Java Strings – Objekte sind. Dass Strings in allen Programmen äußerst häufig vorkommen Und dass sich deshalb Referenzvariablen String-Objekte im String Pool teilen. Das Konzept hinter dem String-Pool ist die Teilung der Ressourcen. Und das bedeutet: Weniger Objekte – mehr […]

Java Übung & Lösung: Gerade oder ungerade Zahlen?

java programmierung übung lösung gerade ungerade zahlen

In dieser Java Übung geht es um Zahlen. Um genau zu sein…. Es geht um gerade und ungerade Zahlen. Zur Erinnerung. Gerade Zahlen sind Zahlen, welche durch zwei teilbar sind. Ungerade Zahlen sind alle Zahlen, welche nicht glatt durch zwei teilbar sind. Ich möchte, dass du eine Klasse „GeradeZahlen“ anlegst. […]

Java Übung & Lösung: Fakultät berechnen und ausgeben

java übung lösung fakultät berechnen ausgeben

In dieser Java Übung geht es um die Fakultät aufeinander folgender Zahlen. Für alle, bei denen der Mathe-Unterricht genauso lange her ist, wie bei mir: Die Fakultät ist das Produkt aufeinander folgender natürlicher Zahlen. Zum Beispiel: Die Fakultät von 2 ist: 1*2=2 Die Fakultät von 5 ist: 1*2*3*4*5=120 So – […]

Java Übung & Lösung: Erstelle ein Mathematik- und Rechenprogramm

java übung lösung rechenprogramm

In dieser Java Übung möchte ich mit dir ein Programm erstellen, welches ein Mathematik-Test oder eine Mathe-Olympiade simuliert. Du kennst das vielleicht noch aus der Schule. Matheolympiade- Da wurden aus allen vier Grundrechenarten, Aufgaben formuliert. Die Schüler mussten diese Aufgaben lösen. Die Lehrer kontrollierten die Lösungen. Und der Schüler, welcher […]

Die sechs Bestandteile aller Java Methoden: Aufbau und Hintergründe

java programmierung methoden aufbau bestandteile

Java Methoden hauchen deinem Java Programm Leben ein. Ohne eine Methode würde deine Java Klasse ein starres Konstrukt sein. Deine Objekte hätten Eigenschaften. Aber sie könnten nichts machen. Und das wäre eine trostlose Welt. Java Methoden sorgen also dafür, dass Objekte interagieren. Methoden bestehen aus bestimmten Bausteinen. Und diese Bausteine […]

Java Übung & Lösung: Kommazahlen auf x-Nachkommastellen runden

java-programmierung-kommazahlen-runden

In dieser Java Übung möchte ich mit dir Zahlen runden. Ich bitte dich deshalb: Erstelle eine Klasse „RundenUebung“. Lege dann eine statische Methode rundeZahl() an. Diese erwartet zwei Parameter. Parameter 1 ist die Kommazahl, welche gerundet werden soll. Als zweiten Parameter wird eine ganze Zahl übergeben, welche die Nachkommastelle – […]

Java Übung & Lösung: Würfelspiel mit Wertspeicherung im Array

java übung lösung spiel array werte speichern

In dieser Java Übung soll ein Würfelspiel simuliert werden. Lege eine Klasse namens, Würfelspiel an. Diese Klasse enthält eine statische Methode, namens würfeln(). Diese Methode erwartet einen Parameter vom Datentyp Integer, namens „anzahlWuerfe“. Diese Variable/Parameter repräsentiert die Anzahl der Würfe. Nachdem der Methode die Anzahl der Würfe übergeben wurde, soll […]