Java/Online-Bank und Java/Installation: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
< Java(Unterschied zwischen Seiten)
(akt + Grafiken)
Markierung: 2017-Quelltext-Bearbeitung
 
Markierung: 2017-Quelltext-Bearbeitung
 
Zeile 1: Zeile 1:
Auf dieser Seite sollen Sie anhand der Simulation eines Online-Kontos selbst Klassen definieren und die grundlegenden Elemente einer (objektorientierten) Programmiersprache
Für die [[Programmiersprache]] '''[[Java]]''' benötigt man zur Programmerstellung das '''JDK''' (''Java Development Kit'', früher '''SDK''' (''Software Development Kit'')) und einen Editor oder besser eine [[#Entwicklungsumgebungen_für_Java|Integrierte Entwicklungsumgebung]]. Zur Programmausführung genügt eine Runtime-Version ('''JRE'''), um JAR-Dateien ausführen zu können.
* [[Java/Glossar#Klasse|Klasse]]
* [[Java/Glossar#Attribut|Attribut]]
* Datentypen für Zahlen: <code>double</code>, für Zeichenketten: <code>String</code>
* [[Java/Online-Bank#Der_erste_Quelltext_der_Klasse_Konto|Quelltext]]
* Instanz eines Objektes
* den [[#Objektinspektor|Objektinspektor]] von BlueJ


und deren Umsetzung in Java mit Hilfe von BlueJ kennen lernen.
=== Download von Java Runtime oder JDK===
Das Java Development Kit (JDK) des Unternehmens Oracle – ehemals von Sun Microsystems – ist eines der von Java-Entwicklern meistgenutzten Java-SDKs:


* [https://www.oracle.com/technetwork/java/javase/downloads/index.html Download Java von Oracle] (Englisch)
* wikibooks: [https://de.wikibooks.org/wiki/Kurzeinstieg_Java:_Einrichten_der_Programmierumgebung Kurzeinstieg Java: Einrichten der Programmierumgebung]
* [https://www.programmierenlernenhq.de/java-8-installieren-auf-windows-10-pc/ Java 8 installieren – Installation des JDK Version 8 auf einem Windows 10 PC]


{{Fortsetzung|
Als Entwicklungsumgebung empfehlen wir [[BlueJ]].
vorher=Einstieg in die OOP|vorherlink=Java/Einstieg in die OOP|
weiter=Algorithmik<br>(Logische Operatoren)|weiterlink=Java/Algorithmik|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}


== Einfache Theorie der Objektorientierten Programmierung ==
{{Box|Empfehlung|Folgen Sie der Installationsanleitung auf der Seite [[BlueJ]] und kommen Sie zu dieser Seite zurück.|Lösung}}
[[Datei:BlueJ Logo.gif|BlueJ Logo|right|200px]] Zunächst klären wir am Beispiel Vogel, was eine '''Klasse''' ist: Ähnlich wie in der Biologie gruppiert man  in  der  OOP  (Objektorientierten  Programmierung)  Objekte  und fasst  sie  in  Klassen  zusammen. Dabei  stellt sich die Frage,  was einen Vogel auszeichnet:


Ein  Vogel  hat  bestimmte  '''Eigenschaften''' (oder '''Attribute'''). Er hat zum Beispiel eine bestimmte Farbe,  ein  Geschlecht  und  man kann seine Flügelspannweite messen.


Ein  Vogel  kann  bestimmte  Dinge  tun.  Er  kann etwa  singen  oder ein Ei legen.  Das  sind die sogenannten  '''Methoden (Operationen)'''  des Vogels (<code>singe(...), legeEi(...)</code> ).


Methoden teilt man in zwei Gruppen ein:
{{Fortsetzung|
* Es  gibt  zum  einen  '''beobachtende'''  oder auch '''sondierende  Methoden'''.  Diese beantworten z.B. die Frage: Welche Farbe hast du?  Im  Programm  werden  sie <code>gibFarbe()</code> oder <code>getFarbe()</code> genannt.
vorher=Java|
* Zum  anderen  gibt  es  Methoden,  die Eigenschaften ändern können (verändernde  Methode).  Ein  Beispiel wäre <code>setFarbe(“gruen“)</code>.
weiter=Erste Schritte<br>("Hallo Welt"-Programm)|weiterlink=Java/Erste Schritte|
 
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
Aus  der  Klasse  Vogel  lassen  sich  konkrete Objekte  bilden:  z.B.  <code>vogel1</code>, <code>vogel2</code>, <code>vogel3</code>. Jedes Objekt hat einen bestimmten  Zustand. So kann z.B. <code>vogel1</code> die Farbe gelb haben, weiblich sein und 40cm Spannweite haben.
Der Zustand von <code>vogel2</code> könnte sein: gelb, 30 cm Spannweite, männlich.  Während die Klasse Vogel etwas abstraktes ist (eine Art Bauplan für Objekte), ist ein Objekt konkret. Was das genau bedeutet, erfahren Sie, wenn  Sie die folgenden Beispiele nachvollziehen.
 
{{Box|Zusammenfassung|Objekte sind in der objektorientierten Programmierung Daten (Eigenschaften oder auch Atrribute)  und  die  damit  verknüpfte  Programmlogik  (Methoden  oder  auch  Operationen), die zu Einheiten, nämlich eben den Objekten, zusammengefasst sind.
 
Gleichartige Objekte werden zu Klassen zusammengefasst.
 
Klassen dienen als Vorlage (wie ein Bauplan) zur Herstellung von Objekten. Von einer Klasse können beliebig viele Objekte hergestellt werden. Die Objekte sind einzigartig, dasie einen unterschiedlichen Namen tragen müssen, obwohl ihr Zustand identisch sein kann.
 
Der Zustand (oder auch Status) ist die Gesamtheit der Werte der Eigenschaften.|Hervorhebung}}
 
=== Klassendiagramm und Objektdiagramm ===
[[Datei:Klassendiagramm-Vogel.png|300px|right]]
Im Klassendiagramm (auch UML-Klassendiagramm genannt) hält man die Elemente einer Klasse anschaulich fest: Klassenname, Eigenschaften und Methoden.
* Im '''Klassendiagramm''' werden Klassenname, Eigenschaften und Methoden festgehalten.
* Alle Methoden, die wir schreiben, sind '''öffentlich''', also <code>public</code>, alle '''Eigenschaften''' sind <code>private</code><br>Im Klassendiagramm bekommen Eigenschaften daher ein vorgestelltes <code> – </code> und Methoden ein <code>+</code>
 
{{Übung|#Skat
## Was sind Eigenschaften der Klasse Kartenspiel?
## Was sind die Methoden?
## Legen Sie ein Klassendiagramm an.
# Nennen Sie Eigenschaften und Methoden des Objektes Kaffeemaschine.
## Legen Sie ein Klassendiagramm an.}}
 
== Beispiel: Online-Bank ==
Wie sieht ein "Bauplan" zu einem Konto aus (z.B. Girokonto an einer Online-Bank)? Dazu beantworte ich die Frage, was ein Konto auszeichnet.
=== Die Klasse Konto ===
Eine Online-Bank benötigt zumindest den Namen des Besitzers und den aktuell vorhandenen Geldbetrag, um ein Konto anzulegen.
 
<code>besitzerName</code> und <code>kontostand</code> sind '''Attribute''' (auch Eigenschaften genannt) der '''Klasse Konto'''.
 
{{Definition|
Ein '''Attribut''' ist ein '''strukturelles Merkmal einer Klasse'''.
* Es hat einen '''Namen''' und einen '''Typ'''.
* Konvention: Attributsnamen werden klein geschrieben.
}}
 
Die Namen von zwei Attributen des Kontos haben wir bereits festgelegt: ''besitzerName'' und ''kontostand''. Nun wird auch ein Typ ([[Java/Glossar#Datentyp|Datentyp]]) für jedes Attribut gefordert.
 
Java kennt verschiedene Datentypen. Zwei für unseren Zweck geeignete sind <code>String</code> und <code>double</code>.
 
'''Zeichenketten''', also Aneinanderreihungen von Zeichen, werden in Java mit dem Datentypen '''String''' deklariert. Der Datentyp String eignet sich als Datentyp für <code>besitzerName</code>, da dieser aus beliebigen Zeichen der Tastatur besteht und nicht etwa eine Zahl ist.
 
Als Typ des Kontostands </code>kontostand</code> bevorzugen wir einen numerischen Datentypen. <code>double</code> kann Zahlen im Bereich von +/-1,7E+308 (also 17 mit 307 Nullen) abspeichern, was für unseren Zweck genügen sollte.
 
{{Übung|
* Nennen Sie mögliche Attribute einer Klasse Auto, Uhr und Kaffeemaschine. Wählen Sie entsprechend Datentypen für die Attribute.
* Nennen Sie Fälle, bei denen der Zahlenbereich für <code>double</code> nicht ausreichend sein könnte.
}}
 
==== Der erste Quelltext der Klasse Konto ====
Nach diesen Einführenden Überlegungen geht es nun daran, den Quelltext zu erarbeiten. Bei jedem Quelltext muss man sich an die Syntax der Programmiersprache richten. In Java beginnen wir damit, eine Klasse zu definieren. Dazu verwenden wir naheliegenderweise das Wort '''class'''.
 
==== Was bedeuten public und private? ====
[[Datei:LG 드럼세탁기와 식기세척기, 영국서 물사용 효율 최우수 제품 수상.jpg|right|200px|Eine moderne Waschmaschine]]
 
'''public''' und '''private'''' regeln die Zugriffsrechte (Fachbegriff: Zugriffsmodifizierer). Vergleichbar ist das mit dem Zugriff auf eine Waschmaschine:
* Die Bedienknöpfe sind <code>public</code>, also öffentlich und von jedem bedienbar.
* Das Innenleben ist <code>private</code>. Hier soll keine Hausfrau und erst Recht kein Hausmann Zugriff haben, da sie bzw. er etwas kaputtmachen könnte. Als erste Faustregel genügt es, sich zumerken, dass Attribute private (Innenleben der Klasse) und Klassen public sind (Jeder soll Klassen ausführen dürfen). Im Klassendiagramm zu Vogel haben  wir  bereits  Zugriffsmodifizierer  gesehen  (siehe  Konvention:Eigenschaften immer private, Klassen immer public)
{{clear}}
==== Schritte zur Eingabe des Quelltexts ====
Nun kommt [[BlueJ]] ins Spiel. Mit "Projekt|neu" wird ein neues Projekt angelegt, das wir "Online-Bank" nennen wollen. Mit "Neue Klasse" legen wir eine Klasse mit dem Namen "Konto" an. Wenn alles richtig geklappt hat, sollte es etwa so aussehen:
 
[[Bild:Onlinebank1.png|right]]
 
Mit einem Doppelklick auf das beige Rechteck kommt zum Editor, in dem man den Quelltext eintippen kann und anschließend mit dem Button "Übersetzen" abspeichert und ''"compiliert"''.
 
 
[[Bild:Onlinebank2.png|right]]
<source lang="java">
public class Konto {
private String besitzerName;
private double kontostand;
}
</source>
Unten sollte nun zu sehen sein "Klasse übersetzt - keine Syntaxfehler". Wenn das nicht der Fall ist, beginnt die Suche nach Tippfehlern.
 
Nun sollten in dem Hauptfenster von BlueJ die Streifen von der Klassendarstellung verschwunden sein. Mit Hilfe der rechten Maustaste kann ich eine "''Instanz des Objektes Konto''" anlegen, indem ich <code>new Konto()</code> wähle.
 
 
[[Bild:Onlinebank3.png]]
 
Ich wähle den vorgegebenen Instanznamen <code>Konto1</code> und schon habe ich mein Objekt, welches BlueJ unten links als rotes Rechteck visualisiert.
 
[[Bild:Onlinebank4.png]]
 
==== Objektinspektor ====
Ein Rechtsklick auf das rote Rechteck und dann auf Inspizieren öffnet den '''Objektinspektor'''. Dieser gibt einen Überblick über den '''Zustand''' des Objektes: Unser Besitzer heißt '''null''', ein Wort, das Java verwendet, wenn String-Variablen noch keinen Wert haben. Der Kontostand ist 0, was der Anfangswert für alle numerischen Variablen ist.
 
[[Bild:Onlinebank5.png]]
 
Zusammenfassung
* Eine  Klasse  (be-)schreibt man in BlueJ mit Hilfe eines  Quelltextes. Der grundsätzliche minimale Aufbau ist:
 
<source lang=java">public class Klassenname {
  // Eigenschaften
  private Datentyp eigenschaft1;
  private Datentyp eigenschaft2;
}</source>
 
* Die Zugriffsmodifizierer <code>public</code> und <code>private</code> regeln die Zugriffsrechte. Als vorläufige Regel ist die Klasse immer <code>public</code> und die Eigenschaften sind immer <code>private</code>.
* Aus Klassen lassen sich Objekte erzeugen, die einen eindeutigen Namen tragen müssen.
* Die Objekte haben einen Zustand, den man mit Hilfe des Objektinspektors ansehen kann. Anfangszustand von Strings ist das englische Wort <code>null</code> und von Zahlentypen <code> 0 </code>.
* Ein „Doppelslash“ <code>// </code> am Anfang der Zeile macht aus der Zeile einen Kommentar, den der Computer ignoriert. Ein Kommentar erläutert den Quelltext.
 
Nun möchten wir natürlich andere Werte setzen, einzahlen, auszahlen usw.. Das wird das Konto auch noch können, allerdings bedarf es dazu eines weiteren Ausbaus.
 
Zunächst daher noch eine
 
{{Übung|
# Erweitern Sie die Klasse Konto um die Attribute <code>kreditlimit</code> und <code>telefonnummer</code>. Welche Datentypen würden Sie verwenden?
# Entwerfen Sie das Klassendiagramm zur Klasse Konto. Entwerfen Sie den Quelltext zur Klasse Vogel.
# Profis: Recherchieren Sie zum Thema "Genauigkeit von Fließkommazahlen", nach den Grenzen der Genauigkeit des Typs double. Welche weiteren numerischen Datentypen bietet Java?
}}
 
=== Konstruktor – Wie sind die Ausgangswerte? ===
Der  '''Konstruktor'''  ist eine  spezielle  Methode, die  bei der  Erzeugung von Variablen aufgerufen wird. Er wird dazu verwendet, die Variable in einen definierten Anfangszustand zu versetzen.Dieser Vorgang nennt sich auch Initialisierung.
 
Wir erweitern die Klasse Konto wie folgt:
<source lang="java">public class Konto {
  // (Instanzvariablen der) Eigenschaften
  private String besitzerName;
  private double kontostand;
  //Konstruktor
  public Konto (String pBesitzerName){
    besitzerName = pBesitzerName; 
    kontostand = 1.0;
  }
}</source>
 
{|class="wikitable"
|-
! Begriff !! Erläuterung
|-
| Konstruktor || legt die Anfangswerte fest. Er erhält den gleichen Namen wie die Klasse selbst: z.B. public Konto<br> Ein Konstruktor ist eine spezielle Methode. Alle Werte, die nicht im Konstruktor festgelegt werden, bekommen einen „default-Wert“. Bei Zahlentypen ist das 0,  bei Strings „null“
|-
|(Übergabe-)parameter || Sind die Werte, die der Methode übergeben werden. Für jeden Parameter muss ein Datentyp festgelegt werden. Der Name des Parameters kann zur besseren Übersicht mit p beginnen: z.B. <code>pBesitzerName</code>
|-
|null || Ist ein leeres Objekt. Es zeigt an, wenn eine Variable bzw. ein Objekt nicht mit einem Wert belegt wurde.
|-
|geschweifte Klammern <code>{ }</code> || Tippt man mit Strg + Alt + 7 bzw. 0. Sie werden eingesetzt, um das Programm zu strukturieren.Die gesamte Klasse steht in geschweiften Klammern und auch Methoden wie der Konstruktor. Das Weglassen von Klammern ist eine typische Fehlerquelle.Das letzte Zeichen einer Klasse ist „}“ (vgl. oben)
|-
| amerikanische Notation|| Java ist amerikanisch, daher Punkt statt Komma: 3.141
|-
|Semikolon || Nach (nahezu) jedem Befehl (Anweisung) möchte Java ein Semikolon ;
|}
 
=== Mehrere Parameter ===
Möchte ich mehrere Parameter übergeben, so trenne ich sie mit einem Komma. Als Beispiel füge ich den Straßennamen hinzu.
{{Box|Hinweis| Im Quelltext meide ich deutsche Umlaute oder Sonderzeichen als Variablennamen.|Hervorhebung2}}
 
<source lang="java">
public class Konto {
  // Eigenschaften
  private String besitzerName;
  private String strassenName;
  private double kontostand;
  //Konstruktor
  public Konto (String pBesitzerName, String pStrassenName){
    besitzerName = pBesitzerName;
    strassenName = pStrassenName; 
    kontostand = 1.0;
  }
}</source>
 
{{Übung|# Vollziehen Sie das angegebene Beispiel nach. Testen Sie Fehleingaben bei BlueJ: Lassen Sie beim Besitzernamen die Anführungsstriche weg, geben Sie eine Zahl, geben Sie nichts ein &hellip;
# Lassen Sie statt des Namens den Kontostand als Parameter übergeben.
# Ergänzen Sie die Eigenschaften <code>vorname</code>, <code>telefonnummer</code>, <code>postleitzahl</code>, <code>geburtsjahr</code>, <code>geschlecht</code> und <code>hausnummer</code>. Begründen Sie dabei, welche Datentypen Sie verwenden.}}
 
=== Methoden – Was kann meine Klasse? ===
Die Methode <code>einzahlen()</code> als Beispiel für eine verändernde Methode


Es sind natürlich noch viele weitere Methoden möglich. Ein weiteres Beispiel ist die Methode <code>einzahlen()</code>.
=== Entwicklungsumgebungen für Java ===
* [https://www.bluej.org/index.html BlueJ] - siehe auch [[BlueJ]]
:BlueJ ist eine kostenlose Entwicklungsumgebung, die auf die Bedürfnisse von Einsteigern im Unterricht Rücksicht nimmt. Zum Überwinden der ersten Hürden sehr sinnvoll. Einstieg mit Screenshots: [http://www.hj-fels.homepage.t-online.de/bluej_info.html Einstieg in Java mit BlueJ] (Hermann Josef Fels)
*[http://www.eclipse.org/ Eclipse]
:Eclipse ist eine universelle KOSTENLOSE Entwicklungsplattform. Ecplise ist selber ein Java-Programm und bietet für die Java-Programmierung auch die beste Unterstützung. Es gibt zahlreiche Plugins, die die Funktionen von Eclipse erweitern können.


<source lang="java">
* [http://www.fujaba.de fujaba.de]
public void einzahlen(doublepBtrag){
:ist ein UML-Werkzeug mit Code-Generator, mit dem viel Objektorientierung ohne viel Quellcode gelehrt und gelernt werden kann
  kontostand += pBetrag;     
* [[Java/Hamster]]
  // oder kontostand = kontostand + pBetrag;
* [[Netbeans]] bzw. Nb-BlueJ-Edition
}</source>
* [http://greenfoot.org/ greenfoot.org]
Diese Methode sorgt dafür, dass zu dem bisherigen Kontostand ein bestimmter Betrag hinzugefügt wird. Hervorzuheben ist, dass die folgende Zeile nicht mathematisch zu verstehen ist:
* '''Java-Editor''' ist ein Editor für [[Java]] von Gerhard Röhner.
** Im Gegensatz zu Eclipse ist der Java-Editor eine '''didaktisch vereinfachte IDE'''.
** Er unterstützt '''Klassendiagrammerstellung in UML''' und '''spart bei kleineren Projekten Tipparbeit''' durch sinnvolle Buttons.
** Der Java-Editor beherrscht wie [[BlueJ]] auch die interaktive Erzeugung von und Arbeit mit Objekten. Im Gegensatz zu BlueJ unterstützt der Java-Editor aber auch das Modellieren von Klassen (Klassem-Modellierer) und die leichte Erstellung von GUI-Oberflächen.
*''' Vorteil:''' Kostenlos, engagierte Weiterentwicklung, viele Materialien von Kollegen sind auf diesen Editor ausgerichtet
* '''Nachteil:''' Er ist nur für Windows verfügbar. Läuft eingeschränkt auch unter [http://appdb.winehq.org/objectManager.php?sClass=version&iId=10626 wine] in [[Linux]].


kontostand = kontostand + pBetrag;
:: [http://javaeditor.org Java-Editor] - Projektseite
 
Das bedeutet: <code>kontostand</code> wird die Summe aus dem  bisherigen  Kontostand und einem Parameter <code>pBetrag</code> '''zugewiesen'''.
 
{{Übung|# Bauen Sie die Methode <code>einzahlen</code> in Ihre Kontoklasse ein. Testen Sie das Einzahlen von negativen Beträgen, großen Beträgen, 0, Wörtern, Rechnungen...
# Entwerfen Sie auf Grundlage von <code>einzahlen</code> die Methode <code>auszahlen()</code>.
# Entwerfen Sie <code>raubeAus()</code>, die den Kontostand auf 0 setzt.}}
 
==== Zuweisen von Werten bei Variablen====
{{Box| &#61; ist kein Gleichheitszeichen|* Das Gleichheitszeichen hat eine andere Bedeutung als in der Mathematik!
* Das '''Gleichheitszeichen''' wird in Java als '''Zuweisungsoperator''' verwendet.|Hervorhebung}}
 
* Zum Erhöhen einer Variable lässt sich <code> += </code> verwenden (analog -=, *=, /=).
* Zum Erhöhen um 1 kann man <code> ++ </code> schreiben (analog <code> --</code>).<br><code>x = y + 7</code> bedeutet, dass x den Wert der Rechnung y + 7 bekommt.<br><code>x = x + 1</code> bedeutet, dass x um 1 erhöht wird (auch andere Zahlen möglich)<br><code>x += 1</code> gleichbedeutend: x wird um 1 erhöht (auch andere Zahlen möglich)<br><code>x++</code> gleichbedeutend:  x wird um 1 erhöht (geht nur bei 1)<br><code>x = 2 * x</code> bedeutet, dass x verdoppelt wird.
* Auf  der  linken Seite des Gleichheitszeichens steht ausschließlich die Variable, die einen neuen Wert bekommen soll. Auf der rechten Seite steht eine Rechnung, die den neuen Wert ergibt. Dabei darf die Variable links als Wert in der Rechnung rechts vorkommen. Dort wird der alte Variablenwert benutzt.
 
 
==== Die set-Methoden als Beispiel für verändernde Methode ohne Rückgabewert ====
Diese einfache Methode verändert den Namen des Kontobesitzers. Eine Methode ohne Rückgabewert wird mit <code>public void</code> (void entspricht im englischen etwa: nichts) eingeleitet.
 
<source lang="java">
public void setBesitzerName(String pNeuerName){
  besitzerName = pNeuerName;
}</source>
 
==== Die get-Methoden als Beispiel für sondierende Methoden ====
Eine ebenso einfache Methode liest den Namen des Kontobesitzers wieder aus:
 
<source lang="java">
public String getBesitzerName(){
  return besitzerName;
}</source>
 
{{Merke|Wann schreibe ich void?
* <code>void</code> kommt bei einer Methodendeklaration immer dann vor, wenn es keine Rückgabe gibt.
* <code>return</code> Gibt es eine Rückgabe (return variable), so muss der Datentyp des Rückgabewertes eingetragen werden.}}
 
{{Übung|# Schreiben Sie die get- und set-Methode zu der Eigenschaft kontostand.
# Schreiben Sie die Methode <code>bucheZinsen (double zinssatz)</code>, die auf den vorliegenden Kontostand <code>zinssatz</code>, Prozent, Zinsen addiert.
# Zeichnen Sie das Klassendiagramm zu der aktuellen Klasse Konto.}}
 
== Einige Beispiele ==
Wenn Sie bedenken, wie dick üblicherweise Java-Bücher sind, dann können Sie von den Beispielen zur Zeit noch nicht viel erwarten. Einige einfache Beispiele zeige ich Ihnen hier dennoch, damit Sie einen Überblick bekommen, wie eine Klasse in Java aufgebaut ist.
 
=== Der Zähler ===
Der Zähler ist eine einfache Klasse, bei dem Sie bei Aufruf der Methode <code>erhoeheZaehlerstand()</code> den Zähler um 1 erhöhen.
 
Anwendungen: Verkehrszählungen, Heizungsverbrauchzähler, Bildzähler bei einer  Kamera,  Rundenzähler  bei  der  Carrera-Bahn... 
 
Bei  den  realen  Anwendungen  kommt  der Impuls von einem Sensor bzw. einen Druckknopf. Bei der Simulation müssen Sie statt dessen eine Methode ausführen.
 
<source lang="java">
public class Zaehler
{
// Instanzvariablen der Eigenschaften
int zaehlerstand;
// Konstruktor
public Zaehler()
    // Der Anfangszählerstand soll immer 0 sein.
    zaehlerstand=0;
}
// Methoden
public void erhoeheZaehlerstand()
    {
      zaehlerstand += 1;
      // oder zaehlerstand++;
      // oder zaehlerstand=zaehlerstand+1;
    }
}</source>
=== Das Telefonbuch ===
[[Datei:Klassendiagramm-Telefonbuch.png|300px|right]]
Der [[Java/Installation#Entwicklungsumgebungen_für_Java|Java-Editor]] half bei der Erstellung dieser Klasse. Unter UML|neue  Klasse  erhalten  Sie  ein  praktisches  Auswahl-Menü, das Ihnen viel Tipparbeit ersparen kann. Der  Java-Editor zeigt übrigens  im Klassendiagramm auch den Konstruktor an. Das wird in der Literatur nicht einheitlich gemacht, oftmals wird er nicht angegeben.Die Telefonnummer wird, obwohl sie laut Name eine Nummer ist, als String eingelesen, um Eingaben wie „/“ zwischen Vorwahl und Nummer zuzulassen. Die Besonderheit an dieser Klasse ist, dass <code>name</code> nur durch den Konstruktor verändert werden kann. D.h. ich kann zwar mit  <code>setTelefonnummer</code> nachträglich  Telefonnummern  ändern, aber der Name bleibt erhalten. Allenfalls durch das Löschen des Objektes kann ich Personen aus dem Telefonbuch entfernen.
 
{{Achtung|Ohne dass wir in Dateien speichern können, werden bei einem Neustart von BlueJ alle Objekte wieder entfernt. Geben Sie also nicht die Telefonnummern ihrer gesamten Freunde ein, das Telefonbuch ist noch nicht fertig!}}
 
<source lang="java">
public class Telefonbuch {
 
  // Eigenschaften
  // Anfang Variablen
  public String name;
  public String telefonnummer;
  // Ende Variablen
 
  // Konstruktor
  public Telefonbuch(String name, String telefonnummer) {
  // ... Hier fehlen 2 Zeilen. Bitte nachtragen! (vgl. Übung)
  }
  // Anfang Ereignisprozeduren
 
  // Methoden
  public String getTelefonnummer() {
    return telefonnummer;
  }
 
  public void setTelefonnummer(String pTelefonnummer) {
    telefonnummer = pTelefonnummer;
  }
 
  public String getName() {
    return name;
  }
 
  // Ende Ereignisprozeduren
}</source>
 
=== Das Auto ===
[[Datei:Klassendiagramm-Auto.png|right|300px]]
Die folgende Klasse ist schon sinnvoller. Sie ist in ähnlicher  Weise in vielen Bordcomputern von  modernen Autos eingebaut: Die elementare Frage beim Autofahren ist: wie weit komme ich noch, ohne zu tanken. Die Klasse simuliert ein Auto, erfasst aber nur Daten um den Tank und den Verbrauch. 
 
Besonderheit:  <code>tanke(..)</code>  und <code>fahre(...)</code>  sind Methoden, die den aktuellen Füllstand beeinflussen. Es sind auch in der Realität die einzigen Arten, wie man den Füllstand eines  Autos  ändert  (von  <code>klaueBenzin()</code>, <code>tropfeHeraus()</code> und <code>verdampfe()</code> abgesehen). Spannend ist die sondierende Methode <code>getAktuelleMaximaleReichweite</code>, die den Wert in km zurückgibt, der bei aktuellem Füllstand noch gefahren werden kann. Die Probleme der Klasse liegen noch darin, dass man (auch über das Tankvolumen hinaus) soviel tanken kann wie man will und dass der Tankinhalt auch in den negativen Bereich fahren kann (Dispokredit bei der Tankstelle). Das können wir erst lösen, wenn wir die bedingte Ausführung kennen gelernt haben. Der folgende Quelltext ist aus dem Java-Editor übernommen.
 
<source lang="java">
public class Auto {
 
  private double volumenTank;
  private double verbrauchAuf100km;
  private double aktuellerFuellstand;
 
  // Konstruktor
  public Auto(double pVolumenTank, double pVerbrauchAuf100km) {
    volumenTank=pVolumenTank;
    verbrauchAuf100km=pVerbrauchAuf100km;
    aktuellerFuellstand=0; // Bei Auslieferung ist der Tank leer
  }
 
  public double getAktuellerFuellstand() {
    return aktuellerFuellstand;
  }
 
  // Methoden
  public void setAktuellerFuellstand(double pAktuellerFuellstand) {
    aktuellerFuellstand = pAktuellerFuellstand;
  }
 
  public double getVerbrauchAuf100km() {
    return verbrauchAuf100km;
  }
 
  public double getVolumenTank() {
    return volumenTank;
  }
 
  public void tanke(double menge) {
    this.aktuellerFuellstand+=menge; // füge Menge hinzu
  }
 
  public void fahre(double pKilometerZahl) {
    // Die Formel sagt folgendes aus:
    // vom aktuellen Füllstand wird abgezogen: der Verbruch bei der Kilometerzahl 
    aktuellerFuellstand -= pKilometerZahl / 100 * verbrauchAuf100km;
  } 
 
}</source>
 
 
{{Übung|# Analysieren und testen Sie alle 3 Programme. Warum bekommt nicht jede Eigenschaft eine get- und eine set-Methode?
# Zu Zähler:
## Ergänzen Sie die Methode: <code>getZaehlerstand()</code>
## Ergänzen Sie die Methode: <code>aufNullSetzen()</code> und <code>erhöheUm(double pZahl)</code>
# Zu Telefonbuch: Ergänzen Sie die fehlenden Zeilen zum Konstruktor.
## Ergänzen Sie die Eigenschaften <code>geburtsdatum</code> (ggf. noch <code<schuhgröße</code>). Welchen Datentypen verwenden Sie?
## Benötigt die Eigenschaft eine set-Methode?
# Zum Auto: Ergänzen Sie die Methode: <code>getMaximaleReichweiteBeiVollemTank()</code>
# Entwickeln Sie die Klasse Handy, die die Eigenschaften <code>telefonnummer</code>, <code>guthaben</code> und <ode>gespraechskostenProMinute</code>. Entwickeln Sie geeignete Methoden.
# Übung für Fortgeschrittene: Realisieren Sie die Klasse Bruch mit den Eigenschaften <code>zaehler</code> und <code>nenner</code> und realisieren Sie die Methoden <code>addierenEinerGanzenZahl</code>, <code>kuerzen</code> und <code>erweitern</code>. Wenn Sie schon Vorwissen haben, können Sie hier für eine erweiterte Variante schauen: [https://drdanielappel.de/informatik/mein-kleines-java-tutorium/2-einstieg-in-die-objektorietierte-programmierung/2-04-anwendungsbeispiel-bruchrechnung/ 2.04 Anwendungsbeispiel Bruchrechnung] (drdanielappel.de)}}
 
== Interaktion zwischen Objekten ==
Zum Schluss des Kapitels behandeln wir, wie zwei Objekte miteinander kommunizieren können. Ein schönes Beispiel dafür ist die Methode <code>ueberweise()</code>:
 
<source lang="java">
public void ueberweise(double pBetrag, Konto pZielkonto){
  abheben(pBetrag);   
  zielkonto.einzahlen(pBetrag);
}</source>
 
Es gibt diesmal zwei Parameter, die wir, wie schon beim Konstruktor, mit Komma trennen. Die Besonderheit ist, dass der Datentyp von Zielkonto wieder ein Konto ist. Man darf also Klassen  als Datentypen  angeben –  ja,  man  darf sogar in  Methoden  den  Datentypen der Klasse verwenden, zu dem die Methode gehört. Das ist sinnvoll, denn üblicherweise möchte man von einem Konto auf ein anderes Konto überweisen. Also muss das Konto überweisen können (wenn man keine Klasse Bank erschafft, die die Konten verwaltet. Aber das ist ein Thema für später)
 
<source lang="java">
abheben(betrag);
zielkonto.einzahlen(pBetrag);
</source>
 
{{Box|Wichtig!| Eigenschaften, die <code>private</code> sind, sind nur für Objekte der gleichen Klasse sichtbar. D.h. theoretisch können wir von dem einen Konto auf die Eigenschaften des anderen Kontos zugreifen. Damit es nicht zu Verwechslungen kommt, sollten Sie sich das aber erst gar nicht angewöhnen.
 
'''Konvention:'''
 
Auf die Daten von fremden Objekten oder Klassen greifen wir immer über Methoden und nie über deren Eigenschaften zu. Dies gewährleistet, dass nichts Ungewolltes verändert wird (vgl. Waschmaschinenbeispiel). Nur innerhalb des Objektes selbst verändert man die eigenen Eigenschaften direkt.|Hervorhebung}}
 
{{Übung|# Schreiben Sie die Methode <code>holeEinzug (double betrag, Konto zielkonto)</code>, bei dem das Geld von einem fremden Konto überwiesen wird.
# Schreiben Sie die Methode <code>vererben (Konto erbe)</code>, bei dem das gesamte Geld eines Kontos auf ein anderes verbucht wird.
# Schreiben Sie die Methode <code>binIchReich(Konto vergleichskonto)</code>, das die Differenz aus dem eigenen Kontostand mit einem anderen Konto vergleicht.
# Schreiben Sie die Methode <code>stifteVerwirrung(Konto konto1, Konto konto2)</code>, bei der ein unbeteiligtes Konto dafür sorgt, dass das gesamte Geld von <code>konto1</code> auf </code>konto2</code> überwiesen wird.
# Schreiben Sie die Methode <code>stifteNochMehrVerwirrung(Konto konto1, Konto konto2)</code>, bei der ein unbeteiligtes Konto dafür sorgt, dass das gesamte Geld von <code>konto1</code> halbiert, das von <code>konto2</code> aber verdoppelt wird.
# Schreiben Sie die Methode <code>bekommeZinsen(double zinsatz)</code>, das entsprechend des Zinssatzes den Kontostand erhöht.
# Lassen Sie von einem Konto den Namen des Besitzers eines anderen Kontos ändern. Welche Probleme ergeben sich, wenn Sie die Methode <code>setBesitzerName</code> weglassen?
}}
 
 
 
{{Fortsetzung|
vorher=Einstieg in die OOP|vorherlink=Java/Einstieg in die OOP|
weiter=Algorithmik<br>(Logische Operatoren)|weiterlink=Java/Algorithmik|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}


== Weblinks ==
== Weblinks ==
* vgl. {{wpde|Objektorientierte Programmierung#Klassen|Klassen}}
* {{wpde|Java Development Kit}}
* vgl. {{wpde|Attribut (UML2)|Attribut (UML2)}}
* http://www.informatik.ursulaschule.de/index.php?cid=368


[[Kategorie:Java]]
[[Kategorie:Java]]
[[Kategorie:Informatik]]
[[Kategorie:Unterrichtsidee]]

Version vom 21. August 2019, 06:20 Uhr

Für die Programmiersprache Java benötigt man zur Programmerstellung das JDK (Java Development Kit, früher SDK (Software Development Kit)) und einen Editor oder besser eine Integrierte Entwicklungsumgebung. Zur Programmausführung genügt eine Runtime-Version (JRE), um JAR-Dateien ausführen zu können.

Download von Java Runtime oder JDK

Das Java Development Kit (JDK) des Unternehmens Oracle – ehemals von Sun Microsystems – ist eines der von Java-Entwicklern meistgenutzten Java-SDKs:

Als Entwicklungsumgebung empfehlen wir BlueJ.


Empfehlung
Folgen Sie der Installationsanleitung auf der Seite BlueJ und kommen Sie zu dieser Seite zurück.


Entwicklungsumgebungen für Java

BlueJ ist eine kostenlose Entwicklungsumgebung, die auf die Bedürfnisse von Einsteigern im Unterricht Rücksicht nimmt. Zum Überwinden der ersten Hürden sehr sinnvoll. Einstieg mit Screenshots: Einstieg in Java mit BlueJ (Hermann Josef Fels)
Eclipse ist eine universelle KOSTENLOSE Entwicklungsplattform. Ecplise ist selber ein Java-Programm und bietet für die Java-Programmierung auch die beste Unterstützung. Es gibt zahlreiche Plugins, die die Funktionen von Eclipse erweitern können.
ist ein UML-Werkzeug mit Code-Generator, mit dem viel Objektorientierung ohne viel Quellcode gelehrt und gelernt werden kann
  • Java/Hamster
  • Netbeans bzw. Nb-BlueJ-Edition
  • greenfoot.org
  • Java-Editor ist ein Editor für Java von Gerhard Röhner.
    • Im Gegensatz zu Eclipse ist der Java-Editor eine didaktisch vereinfachte IDE.
    • Er unterstützt Klassendiagrammerstellung in UML und spart bei kleineren Projekten Tipparbeit durch sinnvolle Buttons.
    • Der Java-Editor beherrscht wie BlueJ auch die interaktive Erzeugung von und Arbeit mit Objekten. Im Gegensatz zu BlueJ unterstützt der Java-Editor aber auch das Modellieren von Klassen (Klassem-Modellierer) und die leichte Erstellung von GUI-Oberflächen.
  • Vorteil: Kostenlos, engagierte Weiterentwicklung, viele Materialien von Kollegen sind auf diesen Editor ausgerichtet
  • Nachteil: Er ist nur für Windows verfügbar. Läuft eingeschränkt auch unter wine in Linux.
Java-Editor - Projektseite

Weblinks