Java Kurs

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Java</language>
Java ist eine objektorientierte Programmiersprache. Selbst für einfachste Programme ist deshalb ein gewisses Grundgerüst in Form einer Klasse nötig. Um zunächst einfache Grundstrukturen von Java zu verstehen, wollen wir auf dieses Grundgerüst zunächst verzichten und nur einfache Java Methoden entwickeln. 

== Datentypen ==

Java unterscheidet zwischen primitiven Datentypen (einfachen) und Objekten. Wir wollen uns zunächst den einfachen Typen zuwenden. Dazu zählen die folgenden:

<center>
{| style="text-align:center;border:solid grey 1px" cellpadding=3 cellspacing=0
|- style="background:#FFE466;"
! Typ     !! Byte !! Wertebereich  	 !!  Standardwert
|- style="background:#FFE466;"
| Boolische Datentypen || || ||
|-
| boolean || 1    || true,false          || false 
|- style="background:#FFE466;"
| Integer || || ||
|-
| byte    || 1    || - 2<sup>07</sup> bis 2<sup>07</sup>-1 || 0 
|-
| short   || 2    || - 2<sup>15</sup> bis 2<sup>15</sup>-1  || 0 
|-
| int 	  || 4    || - 2<sup>31</sup> bis 2<sup>31</sup>-1  || 0 
|-
| long 	  || 8    || - 2<sup>63</sup> bis 2<sup>63</sup>-1  || 0 
|- style="background:#FFE466;"
| Fließkommazahlen || || ||
|-
| float   || 4 	  || - 3.40282347 *10<sup>38</sup> bis 3.40282347 *10<sup>38</sup> || 0.0
|-
| double  || 8 	  || - 1.79769313486231570 *10<sup>308</sup> bis 1.79769313486231570 *10<sup>308</sup> || 0.0
|- style="background:#FFE466;"
| Zeichen || || ||
|-
| char    || 2    ||  alle Unicode - Zeichen || \n0000
|}
''Zu beachten ist, dass reelle Zahlen mit Punkt also 12.5 (nicht 12,5) notiert werden.''
</center>  	 	  	 


Um uns etwas mit dieser Schreibweise vertraut zu machen, wenden wir einfache Rechenoperatoren auf ganze und reelle Zahlen an. Gib in das obere Kästchen eine Gleichung ein. Anschließend kannst du mit ''Eval'' diese vom Java-Interpreter ausführen lassen.

<eval rows="1">3*5-12.5</eval>

Ein weiteren Datentyp ist ''String'', welcher Zeichenketten repräsentiert. Eine Zeichenkette wird in " eingeschlossen. ''String'' ist kein primitivenr Typ. Wir wollen ihn dennoch schon jetzt verwenden ohne dessen genauen Definition zu kennen. Auch auf Zeichenketten kann der Operator "+" angewendet werden. Im Gegensatz zu arithmetischen Ausdrücken steht Plus hier für die Verkettung. 

<eval rows="1">"Hallo" + " " + "Welt"</eval>

Zeichenketten können auch mit anderen Datentypen verkettet werden:

<eval rows="1">"Pi ist " + 3.14</eval>

Beachte, dass es sich bei 3.14 um eine Fließkommazahl handelt. Diese wird durch "+" automatisch in eine Zeichenkette "3.14" konvertiert und anschließend mit "Pi ist " verkettet. Was passiert wenn man etwa folgenden Ausdruck schreib: "2 mal Pi ist " + 3.14*2 ?

== Methoden aufrufen und definieren ==

Um eine Methode aufzurufen verwenden wir den Methodennamen gefolgt von runden Klammern. Dies entspricht der Funktionsvorstellungen aus der Mathematik f(x). In diesem Fall ist x der Parameter zu dem uns die Funktion f einen Funktionswert berechnen soll. 

Nehmen wir die Sinus Funktion sin(x). Wir wissen, dass für x eine Fließkommazahl angegeben wird (etwa Pi) und eine Fließkommazahl zurückgeliefert wird. Java bietet uns bereits eine fertige Methode sin(x) an, die wir verwenden können. Alle mathematischen Funktionen sind dabei in der Klasse ''Math'' definiert. Was genau eine Klasse ist, werden wir uns erst später genauer anschauen. 

<eval rows="1">Math.sin(1)</eval>

Hier haben wir die Methode ''sin(x)'' der Klasse ''Math'' verwendet. Experimentiere mit mit weiteren Funktionen wie ''cos(x)'', ''tan(x)'' oder ''sqrt(x)'' (Quadratwurzel).

Wir wollen uns nun eine eigene Funktion für Pi definieren. Es handelt sich dabei um eine null-stellige Funktion ''gibPi()''. Das ist auch klar, denn wir benötigen keinen Parameter ''gibPi(5)'' macht offensichtlich keinen Sinn. Es soll stets 3.14 als Funktionswert zurückgegeben werden. 

Um eine Methode zu definieren müssen wir zunächst den Rückgabetyp festlegen. Für unsere Methode ''gibPi()'' wählen wir den primitiven Datentyp ''double'' aus. Es handelt sich dabei um eine reelle Zahl. Anschließend müssen wir den Namen unserer Methode angeben. Diesen können wir beliebig wählen, wir müssen nur einige Regeln beachten. Ein Name darf zum Beispiel nicht mit einer Zahl beginnen oder Sonderzeichen enthalten.

Schau dir den nachfolgen Quelltext genau an und versuche dessen Bedeutung zu erahnen: 

<code rows="3">
double gibPi () { 
  return 3.14; 
}</code>

Die geschweiften Klammern markieren den Begin und das Ende der Definition der Methode ''gibPi()''. Der Befehl ''return'' ist dafür verantwortlich unseren Wert 3.14 als Rückgabewert der Methode ''gibPi()'' zu setzen. Unsere Methode können wir nun genau wie f(x) aufrufen. Nachfolgendes Beispiel zeigt einen solchen Aufruf:

<eval rows="1">"Pi ist: " + gibPi() + " der Sinus von Pi ist: " + Math.sin(gibPi())</eval>

Wie bei Math.sin(...) zu sehen, können wir auch den Rückgabewert unserer Methode wieder als Parameter einer anderen einsetzen. 

Schlag im Internet den genauen Wert von Pi nach und ändere die Methode ''gibPi()'' so, dass etwa 8 Nachkommastellen ausgegeben werden - nicht nur 2. Der Sinus von Pi sollte ja bekanntlich 0 ergeben. Du wirst feststellen, dass wir zwar einen Wert sehr nah an 0 erhalten (beachte die Exponentialschreibweise wie E-9 am Ende der Zahl), jedoch auf Grund der Genauigkeit von ''double'' nur eine Näherung bekommen. 

== Methoden mit Parameter ==

Gehen wir nun einen Schritt weiter und definieren eine Methode mit Parameter. Betrachte zunächst die folgende Methode zur Kreisflächenberechnung und vergleiche sie mit unser null-stelligen ''gibPi()'' Methode.

<code rows="3">
double KreisA (double radius) { 
  return radius*gibPi(); 
}</code>

<eval rows="1">"Die Fläche eines Kreises mit r=3cm beträgt: " + KreisA(3) + "cm²"</eval>

Die Methode ''KreisA'' besitzt genau einen Parameter ''radius''. Dieser kann innerhalb der Methode (innerhalb der geschweiften Klammern) als eine Art Platzhalter verwendet werden. Ein Aufruf ''KreisA(5)'' berechnet demnach ''return 5*gibPi()''. 

''radius'' ist vom Datentyp ''double''. Damit erklären wir Java, dass wir als Parameter genau eine Fließkommazahl erwarten. Ein Aufruf wie ''KreisA("Hallo")'' würde also zu einem Fehler führen (versuch es einfach mal). 

Wenn wir mehr als einen Parameter benötigen, können wir diese durch Kommas getrennt hintereinander angeben. Wir definieren eine Methode zur Berechnung des Flächeninhalts eines Rechtecks:

<code rows="3">
double RechteckA (double a, double b) { 
  return a*b; 
}</code>

Als Parameter haben wir ''a'' und ''b'' definiert, denn bekanntlich benötigen wir zur Berechnung der Fläche die Kantenlängen des Rechtecks. Wenn wir diese Methode aufrufen müssen wir die Parameter wieder durch Kommas voneinander trennen: 

<eval rows="1">"Die Fläche eines Rechtecks bin a=3.1 und b=5.7 ist: " + RechteckA(3.1,5.7) + "cm²"</eval>