Java Basis-Sprachelemente: Unterschied zwischen den Versionen
Zeile 436: | Zeile 436: | ||
==while-Schleife== | ==while-Schleife== | ||
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist. | Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist. | ||
'''Erklärvideo''' | |||
Hier gibt es ein '''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (auf youtube, 11:49min)]''' <br/>'' (anhand eines Greenfoot-Szenarios) | |||
'''Beispiel:''' | '''Beispiel:''' | ||
Version vom 24. Februar 2019, 13:13 Uhr
Allgemeines
Hier werden die grundlegenden Sprachelemente von Java im Detail erklärt.
Wer wissen möchte, wie eine ganze Klasse aussieht:
Erklärvideo
Hier gibt es ein Erklärvideo zu Klassen, Objekten, Attritbuten & Methoden (auf youtube, 17:08min)
(anhand eines Greenfoot-Szenarios)
Außerdem gibt es hier ein Arbeitsblatt zum Video (PDF). Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.
Anforderungen Zentralabitur
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.
Stand: 2012 (im April 2013 noch aktuell)
- Klassendefinitionen
- Beziehungen zwischen Klassen
- gerichtetete Assoziation
- Vererbung
- Attribute und Methoden (mit Parametern und Rückgabewerten)
- Wertzuweisungen
- Verzweigungen (if, switch)
- Schleifen (while, for, do-while)
Klasse, Objekt, Klassendefinition
Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.
Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: Klasse in Java
- Von einer Klasse können viele Objekte erzeugt werden.
- Beispiel: Es gibt eine Klasse
Crab
, von der man viele einzelne Objekte erzeugen kann. - Java: Definiton einer Klasse:
public class Crab
{
// Attribute
// Konstruktor
// Methoden
}
Attribute
- Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.
- Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den Attribut-Wert haben.
- Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.
- Attribute haben einen Attribut-Typ. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa
int
für ganze Zahlen. Für Namen eignet sichString
. - Java:
- Attribute werden direkt nach der Klassen-Deklaration notiert.
- Attribute sind in der Regel
private
, d.h. sie können nicht ohne Weiteres von Außen verändert werden.
Beispiel 1:
Objekte der Klasse Crab
können unterschiedliche Geschwindigkeiten haben.
Dafür gibt es das Attribut geschwindigkeit
public class Crab
{
// Attribute
private int geschwindigkeit;
// Konstruktor
// Methoden
}
Beispiel 2:
Objekte der Klasse Baum
bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).
public class Baum
{
// Attribute
private Quadrat stamm;
private Kreis krone;
// Konstruktor
// Methoden
}
Konstruktor
Aufruf des Konstruktors:
- Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:
- Java:
Crab neueKrabbe = new Crab();
Deklaration des Konstruktors:
- In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.
- Der Konstruktor heißt genauso wie die Klasse.
- Der Konstruktor hat keinen Rückgabetyp, also auch kein
void
.
Beispiel:
public class Crab
{
// Attribute
private int geschwindigkeit;
// Konstruktor
public Crab()
{
turn(50);
}
// Methoden
}
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.
Konstruktor mit Parameter
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.
Beispiel:
public class Crab
{
// Attribute
private int geschwindigkeit;
// Konstruktor
public Crab(int pGeschwindigkeit)
{
geschwindigkeit = pGeschwindigkeit;
}
// Methoden
}
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.
Aufgerufen wird dieser Konstruktor dann z.B. so:
Crab neueKrabbe = new Crab(3);
Damit hat neueKrabbe
die Geschwindigkeit 3.
Methoden
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.
Beispiel:
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.
public class Crab
{
// Attribute
private int geschwindigkeit;
// Konstruktor
public Crab()
{
turn(50);
}
// Methoden
public void setzeGeschwindigkeit(int neueGeschwindigkeit)
{
geschwindigkeit = neueGeschwindigkeit;
}
public int gibGeschwindigkeit()
{
return geschwindigkeit;
}
}
Methodendeklaration / Methodenkopf
Methoden werden durch den Methodenkopf (auch: die Methodensignatur) deklariert.
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.
Erklärvideo
Hier gibt es ein Erklärvideo zu Methodensignaturen (auf youtube, 11:42min).
(Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)
Beispiel:
public class Automat {
private int eingeworfen;
...
public void geldEinwerfen(int betragInCent)
{
eingeworfen = eingeworfen + betragInCent;
}
private double steuern(int betrag)
{
double ergebnis = betrag * 0.19;
return ergebnis;
}
public int geldZurueck()
{
int ergebnis = eingeworfen;
eingeworfen = 0;
return ergebnis;
}
}
Der Methodenkopf ist immer gleich aufgebaut:
- Zugriffsmodifikator:
public
oderprivate
.- Auf
public
-Methoden darf man auch von außen zugreifen; sie sind öffentlich. - Auf
private
-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.
- Auf
- Rückgabetyp:
void
für nichts bzw. ein Datentyp (wie z.B.int
) oder auch eine Klasse.- Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.
- Die Methode
public void geldEinwerfen(int betragInCent)
gibt nichts zurück.void
ist das Schlüsselwort für nichts. - Die Methode
public int summe(int a, int b)
gibtint
zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein return-Statement, z.B.:return ergebnis;
- Methodenname: Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen klein zu schreiben.
- Parameter: In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).
- Bei den Parametern wird erst der Parameter-Typ (z.B.
int
) und dann der Parameter-Name angegeben. - Mehrere Parameter werden durch Komma getrennt, z.B.
public int summe(int a, int b)
- Methoden ohne Parameter haben leere Klammern, z.B.:
public int gelZurueck()
- Bei den Parametern wird erst der Parameter-Typ (z.B.
Parameter
- Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.
- Das ist hier der Fall bei der Methode
setzeGeschwindigkeit
: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll. - Dafür haben Methoden Parameter, in diesem Fall
neueGeschwindigkeit
. - Bei Parametern muss immer der Typ festgelegt werden; man spricht von Parameter-Typ.
- Der Parameter-Typ von
neueGeschwindigkeit
istint
, also eine ganze Zahl.
- Der Parameter-Typ von
- Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den Parameter übergeben.
Crab neueKrabbe = new Crab();
// jetzt kommt der Methodenaufruf mit Parameterübergabe!
neueKrabbe.setzeGeschwindigkeit(10);
- Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur
()
. Das ist wichtig, um sie von Attribute zu unterscheiden!
Rückgabetyp einer Methode
Für eine Methode wird immer der Rückgabetyp festgelegt.
void
: Wenn die Methode nichts zurückgibt (bei einer verändernden Methode).- Beispiel:
public void setzeGeschwindigkeit(int neueGeschwindigkeit)
- Beispiel:
int
: Wenn die Methode eine ganze Zahl (int
) zurückgibt.- Beispiel:
public int gibGeschwindigkeit()
- Beispiel:
- Statt
int
kann auch jeder andere Typ oder auch eine Klasse (z.B.Crab
) der Rückgabe-Typ einer Methode sein.- Beispiel:
public Crab gibKopie()
: Diese Methode würde eine Kopie der Krabbe (also ein Objekt der KlasseCrab
) zurückgeben.
- Beispiel:
sondierende Methode / verändernde Methode
- sondierende Methode (=get-Methode): Dieser Methodentyp gibt eine Information über das Objekt zurück. Diese Methode braucht einen Rückgabetyp (d.h. nicht
void
) und ein return-Statement.- Beispiel:
public int gibGeschwindigkeit()
- Beispiel:
- verändernde Methode (=set-Methode): Dieser Methodentyp verändert das Objekt. Häufig hat dieser Methodentyp einen (oder mehrere) Parameter. Sie hat zumeist den Rückgabetyp
void
, denn sie gibt in der Regel nichts zurück.- Beispiel:
public void setzeGeschwindigkeit(int pGeschwindigkeit)
- Beispiel:
Methodenaufruf
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.
VORSICHT: Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!
Beispiel:
Im Beispiel ruft die Methode groessteZahl
dreimal die Methode gibGroessereZahl
auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. groessere12
gespeichert, um damit weiter zu rechnen.
public class Rechner{
public int groessteZahl(int z1, int z2, int z3, int z4)
{
int groessere12 = gibGroessereZahl(z1, z2);
int groessere34 = gibGroessereZahl(z3, z4);
int ergebnis = gibGroessereZahl(groessere12, groessere34);
return ergebnis;
}
public int gibGroessereZahl(int a, int b){
int ergebnis;
if(a > b)
{
return a;
}
else
{
return b;
}
}
}
Methoden für Objekte anderer Klassen aufrufen
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe delegiert.
Beispiel :
public class Baum
{
// Attribute der Klasse Baum
private Kreis krone;
private Quadrat stamm;
// Konstruktor der Klasse Baum
public Baum()
{
stamm = new Quadrat();
stamm.bewegeZuPosition(110,120);
stamm.sichtbarMachen();
krone = new Kreis();
krone.bewegeZuPosition(100,100);
krone.sichtbarMachen();
}
}
Erklärung:
stamm
ist ein Objekt vom TypQuadrat
; deshalb verfügtstamm
über die MethodesichtbarMachen()
.- Im Konstruktor von
Baum
wird diese Methode mithilfe des Punktes aufgerufen:- Attributname -> Punkt -> Methodenname.
Ein Objekt der Klasse Haus
ruft in einem Objekt der Klasse Quadrat
die Methode
lokale Variable
- Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.
- Lokale Variablen kann man (im Gegensatz zu Attributen) nicht in der ganzen Klasse benutzen.
- Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.
- U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.
Beispiel aus der Klasse Baum.java
:
public boolean hatGrueneBlaetter()
{
// lokale Variable
// die lokale Variable ergebnis deklarieren
// und mit true initialisieren
// ergebnis wird am Ende zurueckgegeben!
boolean ergebnis = true;
if(istRot == true)
{
// wenn der Baum rot ist...
// ... hat er keine gruenen Blaetter!
ergebnis = false;
}
// return-Statement: der zurueckgegebene Wert muss den Typ haben
// wie im Methodenkopf angegeben. (Hier: boolean)
return ergebnis;
}
Wertzuweisungen
- Attributen und lokalen Variablen können Werte zugewiesen werden.
- Beispiel 1:
geschwindigkeit = 10;
- Damit wird dem Attribut
geschwindigkeit
der Wert 10 zugewiesen.
- Beispiel 2:
geschwindigkeit = neueGeschwindigkeit;
- Damit wird dem Attribut
geschwindigkeit
der WertneueGeschwindigkeit
zugewiesen.
- Beispiel 3:
geschwindigkeit = geschwindigkeit + 1;
- Damit wird dem Attribut
geschwindigkeit
der Wertgeschwindigkeit+1
zugewiesen, - d.h. die Geschwindigkeit wird um 1 erhöht!
- Allgemein:
- links vom Gleichzeichen steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.
- rechts vom Gleichzeichen steht der neue Wert.
Verzweigungen (if, switch)
if - else
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.
Es passiert folgendes: Wenn (if
) a
größer als b
ist, dann wird ergebnis
auf a
gesetzt, sonst (else
) auf b
.
public int bestimmeDieGroessere(int a, int b)
{
int ergebnis;
if(a > b)
{
ergebnis = a;
}
else{
ergebnis = b;
}
return ergebnis;
}
VORSICHT:
Gleichheit überprüft man mit doppeltem Gleichzeichen:
// Wenn x gleich drei ist, ...
if(x == 3)
{
...
}
switch
//TODO
Schleifen (while, for, do-while)
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.
for-Schleife
Die for-Schleife ist eine Zählschleife. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine Zählvariable, die häufig i
heißt, aber jeder andere Name ist auch denkbar.
Beispiel:
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.
for(int i=0; i<=333; i++)
{
System.out.println(3*i);
}
Erläuterung:
- Die Klammer nach dem
for
hat drei Teile:- Deklaration und Initialisierung der Zählvariable
i
: i startet bei 0. - Schleifenbedingung: Die Schleife wird so lange wiederholt, wie i <= 333 ist.
- Veränderung bei jedem Schleifendurchlauf: i wird bei jedem Schleifendurchlauf um eins erhöht. (
i++
bedeutet dasselbe wiei = i+1
). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333. - Im Schleifenrumpf wird mit
System.out.println(i);
jeweils das Dreifache voni
an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.
- Deklaration und Initialisierung der Zählvariable
while-Schleife
Die while-Schleife ist eine bedingteSchleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die Schleifenbedingung, erfüllt ist.
Erklärvideo
Hier gibt es ein Erklärvideo zu while-Schleifen (auf youtube, 11:49min)
(anhand eines Greenfoot-Szenarios)
Beispiel:
Die folgende while-Schleife beginnt bei zahl = 1
. zahl
wird dann so lange an die Konsole ausgegeben und verdoppelt, wie zahl
kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.
int zahl = 1;
while(zahl < 1000)
{
System.out.println(zahl);
zahl = zahl * 2;
}
Erläuterung:
- Die Klammer nach dem
while
enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist. - Im Schleifenrumpf wird dann
zahl
an die Konsole ausgegeben und dann mitzahl = zahl * 2;
verdoppelt.
Beziehungen zwischen Klassen
TODO
gerichtetete Assoziation
TODO
Vererbung
TODO