Orangensaftpresse

Statische Methoden


Ideen:
A. Maier, G. Kompa Elektronikschule Tettnang, 2020
E. Fuchs, "Java 9 Grundlagen Programmierung", Herdt Verlag, 2017


Methoden in Java dienen zum Auslagern von Programmteilen. Man übergibt beim Methodenaufruf Werte und erhält von der Methode einen berechneten Wert zurück. Dadurch werden Programme übersichtlicher, die Fehlersuche vereinfacht sich und Programmteile sind mehrfach verwendbar.

In diesem Artikel lernst Du den Aufbau von Methoden und deren Anwendung kennen. Begriffe wie Rückgabewert, Parameterliste und Methodenname werden erklärt. Dieser Artikel beschränkt sich auf die Anwendung statischer Methoden.

Die Idee von statischen Methoden

Orangensaftpresse

Stell Dir vor, Du nimmst heute morgen ein paar Orangen, übergibst diese an eine Orangenpresse und erhältst einen frisch gepressten Orangensaft zurück. Dieses Modell erklärt gut die Funktionsweise einer statischen Methode.

Methoden in Java dienen zum Auslagern von Programmteilen. Man übergibt beim Methodenaufruf Werte und erhält von der Methode einen berechneten Wert zurück. Die so erstellten Methoden erhöhen die Struktur/Übersichtlichkeit und sind mehrfach verwendbar. Die Fehlersuche wird vereinfacht und Arbeiten in Projekten lassen sich besser aufteilen.

Methoden werden in Klassen definiert und arbeiten normalerweise mit Objekten. Dies unterscheidet sie von Funktionen in anderen Programmier­sprachen. Statische Methoden hingegen operieren unabhängig von Objekten und können so wie Funktionen eingesetzt werden. Dabei unter­scheidet man:

  • Methoden­definition,
  • Methoden­aufruf,
  • Parameterliste,
  • Rückgabewert.

Methoden definieren Methodendefinition und Parameterliste

Orangenmenge 1 2 3 4 5
Saft in ml 90 180 270 360 450

Allgemein wird eine Methode wie folgt definiert.

Modifier Datentyp Methodenname(Parameterliste){}

Für unsere Methode, welche die Saftmenge berechnet, sieht es wie folgt aus:

static int berechneSaftmenge(int orangenzahl){
  int saftausbeute = 90;
  return orangenzahl*saftausbeute;
}

Man beachte:

  1. Eine Methode besteht aus dem Methodenkopf mit Modifier (wird später behandelt), Datentyp des Rückgabewertes, Methodenname und der Parameterliste sowie dem Parameterrumpf mit den Anweisungen.
  2. Der Methodenname beginnt klein mit einem Verb, da die Methode etwas ausführt.
  3. Die Parameterliste enthält beliebig viele Parameter (hier ein Parameter mit int orangenzahl). Diese werden unter Angabe des Datentyps mit Komma getrennt geschrieben. Ist die Parameterliste leer schreibt man nichts in die Klammern.
  4. Das Schlüsselwort return gibt im Methodenrumpf an, welcher Wert nach dem Aufruf zurück gegeben, bzw. kopiert wird. Achte dabei auf die richtige Datentypangabe (hier int) im Methodenkopf. Gibt man nichts zurück verwendet man das Schlüsselwort void.

Methoden aufrufen Methodenaufruf und Rückgabewert

		
public static void main(String[] args) {
  int glasgroesse;
  //Methode aufrufen zur Bestimmung der Trinkglasgröße
  glasgroesse = berechneSaftmenge(4);
  System.out.println("Glas: "+glasgroesse+" ml");
}

static int berechneSaftmenge (int orangenzahl){
  int saftausbeute = 90;
  return orangenzahl*saftausbeute;
}

Für den Methodenaufruf in der main-Methode genügt folgender Quelltext:

glasgroesse = berechneSaftmenge(4);

Man beachte, dass wie bei einer Orangenpresse das Saftglas den Saft auffängt man bei Methoden eine Variable benötigt, um den Rückgabewert zu speichern. Der Datentyp dieser Variable muss mit dem Datentyp des Rückgabewertes übereinstimmen.

Beim Aufruf werden die aktuellen Parameter in die Methode kopiert. D.h. die Methode legt für den Dauer des Aufrufs neue Variablen an. Die Reihenfolge der Parameter und deren Datentyp müssen dabei korrekt gewählt werden.

Aufgabe 1 Laufende Meter Holzdielen

Die benötigte Menge Holzdielen soll für eine vorgegebene Raumgröße in einer Methode berechnet werden.

  1. Lege eine neues "Java Projekt" mit alt Strg N namens 06-statische-Methoden an.
  2. Erstelle die Klasse Holzdielen und deklariere die Methode berechneLaufendeMeterDielen. Der Methode wird die Raumgröße in Quadratmeter übergeben und sie liefert die Holzmenge von 0,2 m breiten Holzdielen in laufenden Metern.
  3. Berechne in der Methode die laufenden Meter der benötigten Holzdielen

    Um bei einer Raumgröße von 8 m2 die laufenden Meter zu erhalten, teil man diesen Wert durch 0,2: 8 m2/0,2 m = 40 m

  4. Schreibe die main-Methode: Der Benutzer gibt die Raumgröße ein. Die Methode berechneLaufendeMeterDielen wird aufgerufen und das Ergebnis am Bildschirm ausgegeben.
  5. Berücksichtige einen Holzverschnitt von 8 % und gib den Gesamtpreis aus, wenn der laufende Meter 25 EUR kostet.
Holzdielen

Die Ausgabe sollte wie folgt aussehen:

Raumgröße: 12.5 qm
Laufende Meter Dielen: 62.5 m


Aufgabe 2 Ordne zu

Ordne den Methodenaufruf dem Methodenkopf zu oder finde die Fehler.

Welcher Aufruf passt zum Methodenkopf? Wähle eine Antwort.
int add(int a, double b){..}

  1. double summe; summe=add(2, 3.2);
  2. double summe; summe=add(3.2, 2);
  3. int summe; summe=add(2, 3.2);
  4. int summe; summe=add(2.3, 3);

Welcher Methodenkopf passt zu dem Aufruf? Wähle eine Antwort.
add(4,3.41);

  1. int add(double a, double b){..}
  2. void add(int a, double b){..}
  3. int add(int a, double b){..}
  4. void add(char a, double b){..}

Finde die Anzahl der Fehler im folgenden Quelltext.

char suche(char a, int p){..}

...

int platz;
platz=suche('a','b');

Finde die Anzahl der Fehler im folgenden Quelltext.

int bestimmeMenge(int a, int b){..}

...

int terassengroesse, a=4;
terassengroesse=bestimmeMenge(a,12);

Welcher Aufruf passt zum Methodenkopf? Wähle eine Antwort.
void anzeigen( ){..}

  1. double summe; summe=anzeigen( );
  2. anzeigen(2);
  3. anzeigen( );
  4. anzeigen(4);

Welcher Methodenkopf passt zu dem Aufruf? Wähle eine Antwort.
double x = berechne(4,3.41);

  1. double berechne(int a, double b){..}
  2. int berechne(int a, double b){..}
  3. double berechne(boolean a, double b){..}
  4. char berechne(boolean a, double b){..}

Aufgabe 3 Pyramidenvolumen

Eine Pyramide hat eine rechteckige Grundfläche mit den den Seiten $a$ und $b$ und der Höhe $h$. Die Grundfläche $G$ und das Volumen $V$ berechnet sich wie folgt:
$G=ab$ und $V=\frac{G\cdot h}{3}$.

  1. Erstelle die Klasse Pyramide und definiere die Methode berechnePyramidenVolumen.
  2. Lass vom Benutzer die Seitenlängen und die Höhe der Pyramide in der main-Methode eingeben. Rufe die Methode berechnePyramidenVolumen auf. Der Methode werden die beiden Seitenlängen und die Höhe der Pyramide übergeben. Das zurückgegebene Volumen wird am Monitor ausgegeben.
  3. Berechne in der Methode das Pyramidenvolumen und gib den berechneten Wert zurück.
  4. Schreibe einen Algorithmus der das Volumen verschiedener Pyramiden in einer Tabelle auflistet.
Pyramidendach

Die Lösung sollte folgendermaßen aussehen:

Berechnung des Pyramidenvolumens
Länge der Grundseite: 3 m
Breite der Grundseite: 2 m
Höhe der Pyramide: 5 m

Volumen der Pyramide: 10.0 cbm

Übung 4 Mehrwertsteuerrechner

Die Mehrwertsteuer beträgt Anfang 2019 in Deutschland 19 %. Bedingt durch die Coronakrise wird diese im Juli 2020 um drei Prozentpunkte auf 16 % gesenkt.

1 EUR
  1. Erstelle die Klasse Mehrwehrtsteuer und definiere die Methode double berechneSteuervorteil(...).
  2. Lass vom Benutzer den Bruttobetrag (Kaufpreis inklusive 19 % MwSt.) eingeben. Rufe die Methode berechneSteuervorteil auf. Der Methode wird der Bruttobetrag als Parameter übergeben. Die zurückgegebene Steuerersparnis bei verringertem Mehrwertseteuersatz soll ausgegeben werden.
  3. Erstelle die Methode void berechneMehrwertsteuer (...), welche den Nettobetrag, den Mehrwertsteuerbetrag und den Bruttobetrag ausgibt.
  4. Schreibe einen Algorithmus der die Steuerersparnis automatisch von 10 verschiedenen Bruttobeträgen auflistet.
  5. Begründe wieso für den Handel die Steuerersparnis um ein vielfaches höher ist, falls er den Steuervorteil nicht an den Kunden weitergibt.

Die Lösung sollte folgendermaßen aussehen:

Mehrwertsteuerrechner
Gib den Bruttobetrag in EUR ein: 120
Steuervorteil ab Juli 2020: 3,03 EUR
_______________________________________

Nettobetrag:  100,84 EUR
16% MwSt:      16,13 EUR
Bruttobetrag: 116,97 EUR

Entspann dich erstmal ...



Das Rätsel im Advent

Idee: I. Supper

Du fährst mit dem Auto und hältst eine konstante Geschwindigkeit ein.

Auf deiner linken Seite befindet sich ein Abhang. Auf deiner rechten Seite fährt ein riesiges Feuerwehrauto und hält die gleiche Geschwindigkeit wie du. Vor dir galoppiert ein Schwein, das eindeutig größer ist als dein Auto und du kannst nicht vorbei. Hinter dir verfolgt dich ein Hubschrauber auf Bodenhöhe. Das Schwein und der Hubschrauber haben exakt deine Geschwindigkeit.

Was unternimmst du, um dieser Situation gefahrlos zu entkommen?

Schwein in Thailand

Vom Kinderkarusell steigen und weniger Glühwein trinken.

Arrays als Parameter call by reference



		
public static void main(String[] args) {
  int[] reihe = {1,2,3,4,5};
  //Methode aufrufen zum Inkrementieren
  erhoeheWertumEins(reihe);

  for(int i: reihe)
	System.out.print(i+"  ");
}

static void erhoeheWertumEins (int[] folge){
  for(int i=0;i<folge.length;i++)
	folge[i]++;
}

Auch Arrays kann man in Methoden bearbeiten. Das besondere: Man übergibt nur die Adresse des Arrays (engl. reference). Ändert man die Werte des Arrays in der aufgerufenen Methode, werden diese Änderungen direkt in der main-Methode übernommen.

Die Methode erhöheWertumEins hat in diesem Fall den Parameter int[] folge, welcher lediglich auf die Adresse des Arrays verweist. In dieser Methode wird jeder Wert des Arrays um eins erhöht. Man beachte: Bei der for-Schleife kann die geschweifte Klammer entfallen, da nur eine Zeile Quelltext folgt. Bei mehreren Zeilen Quelltext im Schleifenkörper ist eine geschweifte Klammer zwingend erforderlich.

Die Schleife for(int i: reihe) ist eine verbesserte for-Schleife (engl. enhanced for-loop). Sie arbeitet jedes Element des Arrays reihe ab. Die Variable i steht somit nicht für eine Laufvariable, sondern direkt für den Wert des Elements.

Aufgabe 5 Größte Zahl

  1. Erstelle die Klasse GroessteZahl und definiere die Methode static void ziehe6aus49(int[] reihe) zum Erzeugen einer Zahlenreihe.
  2. Schreibe die Methode static void ausgebenZahlenreihe (int[] x) um die unsortierte Zahlenreihe am Monitor auszugeben.
  3. Schreibe die Methode static void bubblesort(int[] bubblereihe) um die Zahlenreihe zu sortieren.
  4. Verwende die Methode static void ausgebenZahlenreihe (int[] x) um die unsortierte Zahlenreihe auszugeben und gib den größten Wert der Zahlenreihe aus.
  5. Verwende den "enhanced for-loop".
import java.util.Random;
...
//zufällige Zahlenreihe erstellen, ohne doppelte Zahlen
for(int i=0; i<anzahl; i++) {
	//Erzeugt eine Zufallszahl zwischen 0 und 49
	x = new java.util.Random().nextInt(50);
	for(int j=i; j>=0; j--) {
		if(x == zahlenreihe[j]){ 
			x = new java.util.Random().nextInt(50);
			j = i;
		}
	}
	zahlenreihe[i]=x;
}

Die Lösung sollte folgendermaßen aussehen:

Die unsortierte Zahlenreihe:
8 3 35 26 33 23

Die sortierte Zahlenreihe:
3 8 23 26 33 35

Die größte Zahl ist: 35

Wortliste und Satzbausteine



die Methode, -n Eine Methode ist ein ausgelagerter Programmteil.
die Methoden­definition Die Methode wird definiert durch den Methodenkopf und den Methodenrumpf. Der Methodenkopf besteht aus Modifier, Datentyp des Rückgabewertes, Methodenname und der Parameterliste; der Methodenrupf aus den Anweisungen inkl. der Rückgabe.
der Methoden­name, -n Der Methodenname beginnt klein mit einem Verb, da die Methode etwas ausführt.
die Parameter­liste, -n eine Liste von Datentypen mit Variablennamen, welche beim Methodenaufruf übergeben werden
der Methoden­aufruf, -e Aufruf eines ausgelagerten Programmteils
der Rück­gabe­wert, -e Wert der aus einer Methode zurückgegeben wird