Benutzer:PascalHänle/Grundvorstellungen zum Ableitungsbegriff/Zusammenfassung Grundvorstellungen zum Ableitungsbegriff und Java/Online-Bank: Unterschied zwischen den Seiten

Aus ZUM-Unterrichten
Markierung: 2017-Quelltext-Bearbeitung
 
Markierung: 2017-Quelltext-Bearbeitung
 
Zeile 1: Zeile 1:
{{Box|Info|
Auf dieser Seite sollen Sie anhand der Simulation eines Online-Kontos selbst Klassen definieren und die grundlegenden Elemente einer (objektorientierten) Programmiersprache
Auf dieser Seite finden Sie die Grundvorstellungen, die Sie sich in diesem Lernpfad selbst erschließen können in einer detaillierten Zusammenfassung. Die Zusammenfassung können Sie auch als PDF oder Word Dokument herunterladen.
* [[Java/Glossar#Klasse|Klasse]]
|Kurzinfo}}
* [[Java/Glossar#Attribut|Attribut]]
* Datentypen für Zahlen: <code>double</code>, für Zeichenketten: <code>String</code>
* [[Quelltext]]
* Instanz eines Objektes
* den Objektinspektor von [[BlueJ]]
und deren Umsetzung in Java mit Hilfe von BlueJ kennen lernen.


==Die Ableitung==
{{Fortsetzung|
überschneidungen, keine getrennt zu betrachten, Differenzierbar, zwei mathematische definitionen
vorher=Einstieg in die OOP|vorherlink=Java/Einstieg in die OOP|
weiter=Beispiel Uhr|weiterlink=Java/Uhr|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}


===Die Ableitung als lokale (momentane) Änderungsrate===
== Einfache Theorie der Objektorientierten Programmierung ==
Die Grundvorstellung der Ableitung als lokale oder auch momentane Änderungsrate baut auf dem Verständnis von Änderungsprozessen auf, die bereits in der Sekundarstufe 1 behandelt wurden. Es wird nun also neben der absoluten Änderung und der mittleren (durchschnittlichen) Änderungsrate auch die lokale Änderungsrate beschrieben.  
[[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:


Wie auch in der Bearbeitung des Lernpfades lässt sich diese Grundvorstellung am besten mit einem Weg-Zeit-Zusammenhang erschließen.  
Ein  Vogel  hat  bestimmte  '''Eigenschaften''' (oder '''Attribute'''). Er hat zum Beispiel eine bestimmte Farbe,  ein  Geschlecht  und  man kann seine Flügelspannweite messen.  


So entspricht im Kontext eines Weg-Zeit-Zusammenhangs die '''absolute Änderung''' der '''Wegzunahme''' <math>f(x_1)-f(x_0)</math>vom Zeitpunkt <math>x_0
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> ).
</math>bis <math>x_1</math>die '''mittlere Änderungsrate''' <math>\frac{f(x_1)-f(x_0)}{x_1-x_0} </math>der '''mittleren (durchschnittlichen) Geschwindigkeit''' im Intervall <math>[x_0,x_1]</math>. Da sich die mittlere Änderungsrate über ein Steigungsdreieck, also über den Differenzenquotienten berechnen lässt, ist sie graphisch mit der Steigung der Sekante zu deuten.


Durch sukzessive Verkleinerung dieses Intervalls lässt sich dann dem genäherten x-Wert eine '''lokale (momentane) Änderungsrate''' <math>f'(x_0) = \lim_{x_1\to x_0} \frac{f(x_1)-f(x_0)}{x_1-x_0}</math>zuschreiben, die der '''momentanen Geschwindigkeit entspricht.''' Die Verkleinerung des Intervalls kann sowohl tabellarisch (siehe Aufgabe ??) als auch graphisch-dynamisch (siehe Aufgabe ??) erfolgen. Die lokale Änderungsrate ist dementsprechend graphisch als die '''Steigung des Graphen an der Stelle''' <math>x_0
Methoden teilt man in zwei Gruppen ein:
</math>, also der '''Steigung der Tangente''' im Berührpunkt <math>P(x_0|f(x_0) </math>zu interpretieren.  
* 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.
* Zum  anderen  gibt  es  Methoden,   die Eigenschaften ändern können (verändernde  Methode).  Ein  Beispiel wäre <code>setFarbe(“gruen“)</code>.


Aus  der  Klasse  Vogel  lassen  sich  konkrete Objekte  bilden:  z.B.  vogel1,  vogel2,  vogel3. Jedes Objekt hat einen bestimmten  Zustand. Sokann z.B. vogel1 die Farbe gelb haben, weiblich sein und 40cm Spannweite haben. Der Zustand von vogel2 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.


Bilder hinzufügen.
{{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.


===Die Ableitung als Steigung der Tangente===
Gleichartige Objekte werden zu Klassen zusammengefasst.


Wie der Name schon sagt, ist bei dieser Grundvorstellung die Ableitung als Steigung der Tangente zu interpretieren. Es gilt also  die bereits vorhandene Vorstellung der Tangente, die im Zusammenhang mit Kreisen erworben wurde, auf das Analytische zu erweitern.
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.


In der Kreisgeometrie der Sekundarstufe 1 wurde die Tangente als eine Gerade definiert, die genau einen gemeinsamen Punkt (Berührpunkt) mit dem Kreis hat. In der Analysis hingegen ist die Tangente von <math>f</math> an der Stelle <math>x_0</math>die Gerade, die den Graphen von <math>f</math>berührt und die gleiche Steigung wie <math>f</math>an dieser Stelle hat.  
Der Zustand (oder auch Status) ist die Gesamtheit der Werte der Eigenschaften.|Hervorhebung}}


Die Ableitung <math>f'(x_0)</math> entspricht also der Steigung von <math>f</math>an der Stelle <math>x_0</math>und ebenso der Steigung der Tangente von <math>f</math>an der Stelle <math>x_0</math>. Veranschaulichen lässt sich dies durch das Funktionenmikroskop (Aufgabe ??), das bei starkem Hineinzoomen in einen Graph zeigt wie sich die Tangente an den Graphen anschmiegt und letztlich nicht mehr von ihm zu unterscheiden ist.
=== 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>


3 Bilder einfügen.  
{{Ü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 einKlassendiagramm an.}}


Hergeleitet wird die Ableitung, also die Steigung der Tangente bei dieser Grundvorstellung über die Steigung von Sekanten. Die Steigung der Sekante durch zwei Punkte <math>P(x_0|f(x_0) </math>und <math>Q(x_1|f(x_1) </math>eines Funktionsgraphen kann mittels Steigungsdreieck und Differenzenquotienten <math>\frac{f(x_1)-f(x_0)}{x_1-x_0} </math> leicht berechnet werden. Lässt man nun den Abstand zwischen <math>x_1</math>und <math>x_0</math>immer kleiner werden, so erhält man die Steigung die der Graph in diesem endlos verkleinerbaren Intervall <math>[x_0,x_1]</math>hat. Es entsteht also letztendlich die punktuelle Steigung des Graphen an der genäherten x-Stelle. Graphisch-dynamisch lässt sich dies durch die Näherung der zwei Punkte <math>P</math>und <math>Q</math> visualisieren (Aufgabe ??). Es entsteht eine Gerade, die den Graphen lediglich berührt und die gleiche Steigung wie der Graph an der genährten x-Stelle hat. Die Tangente. Als die Steigung der Tangente ergibt sich somit der Grenzwert des Differenzenquotienten <math> \lim_{x_1\to x_0} \frac{f(x_1)-f(x_0)}{x_1-x_0}</math>, also die Ableitung <math>f'(x_0)</math>.  
== 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.  


===Die Ableitung als lokale lineare Approximation===
<code>besitzerName</code> und </code>kontostand</code> sind '''Attribute''' (auch Eigenschaften genannt) der '''Klasse Konto'''.  
Um zu erläutern welche Rolle die Ableitung bei der lokalen linearen Approximation einer Funktion einnimmt, wird zunächst geklärt wie sich Funktion lokal, also in sehr kleinen Umgebungen verhalten.  


Zoomt man in verschiedene Funktionen hinein so erkennt man, dass sich Funktionen einerseits lokal linear, also geradlinig oder oder andererseits nicht linear verhalten können (Aufgabe ??).
{{Definition|
Ein '''Attribut''' ist ein '''strukturelles Merkmal einer Klasse'''.  
* Es hat einen '''Namen''' und einen '''Typ'''.
* Konvention: Attributsnamen werden klein geschrieben.
}}


Verhält sich eine Funktionen <math>f</math>an einer Stelle <math>x_0</math>lokal linear, so existiert an dieser Stelle auch die Ableitung <math>f'(x_0)</math>. {{Lösung versteckt|Text zum Verstecken|Label fürs Anzeigen|Label fürs Verbergen}}Label fürs Anzeigen
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.


<br />
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 double 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 public und private regeln die Zugriffsrechte. Als vorläufige Regel ist die Klasse immer public und die Eigenschaften sind immer private.
* 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“ // 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ührungstsriche 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>.
 
<source lang="java">
public void einzahlen(doublepBtrag){
  kontostand += pBetrag;     
  // oder kontostand = kontostand + pBetrag;
}<</source>
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:
 
kontostand = kontostand + pBetrag;
 
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.}}
 
{{Box|Zuweisen von Werten bei Variablen|2=* Das '''Gleichheitszeichen''' wird in Java als '''Zuweisungsoperator''' verwendet.
* Zum Erhöhen einer Variable lässt sich += verwenden (analog -=, *=, /=).
* Zum Erhöhen um 1 kann man ++ schreiben (analog --).<br>x = y + 7 bedeutet, dass x den Wert der Rechnung y + 7 bekommt.<br>x = x + 1 bedeutet, dass x um 1 erhöht wird (auch andere Zahlen möglich)<br>x += 1 gleichbedeutend:  x wird um 1 erhöht (auch andere Zahlen möglich)<br>x++ gleichbedeutend:  x wird um 1 erhöht (geht nur bei 1)<br>x = 2 * x 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.
* Das Gleichheitszeichen hat eine andere Bedeutung als in der Mathematik!|Hervorhebung}}
 
==== Die set-Methoden als Bspl. 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.}}
 
{{Fortsetzung|
vorher=Einstieg in die OOP|vorherlink=Java/Einstieg in die OOP|
weiter=Beispiel Uhr|weiterlink=Java/Uhr|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
 
== Weblinks ==
* vgl. {{wpde|Objektorientierte Programmierung#Klassen|Klassen}}
* vgl. {{wpde|Attribut (UML2)|Attribut (UML2)}}
* http://www.informatik.ursulaschule.de/index.php?cid=368
 
[[Kategorie:Java]]
[[Kategorie:Informatik]]
[[Kategorie:Unterrichtsidee]]

Version vom 18. August 2019, 03:58 Uhr

Auf dieser Seite sollen Sie anhand der Simulation eines Online-Kontos selbst Klassen definieren und die grundlegenden Elemente einer (objektorientierten) Programmiersprache

und deren Umsetzung in Java mit Hilfe von BlueJ kennen lernen.

Einfache Theorie der Objektorientierten Programmierung

BlueJ Logo

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 (singe(...), legeEi(...) ).

Methoden teilt man in zwei Gruppen ein:

  • Es gibt zum einen beobachtende oder auch sondierende Methoden. Diese beantworten z.B. die Frage: Welche Farbe hast du? Im Programm werden sie gibFarbe() oder getFarbe() genannt.
  • Zum anderen gibt es Methoden, die Eigenschaften ändern können (verändernde Methode). Ein Beispiel wäre setFarbe(“gruen“).

Aus der Klasse Vogel lassen sich konkrete Objekte bilden: z.B. vogel1, vogel2, vogel3. Jedes Objekt hat einen bestimmten Zustand. Sokann z.B. vogel1 die Farbe gelb haben, weiblich sein und 40cm Spannweite haben. Der Zustand von vogel2 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.


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.

Klassendiagramm und Objektdiagramm

Klassendiagramm-Vogel.png

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 public, alle Eigenschaften sind private
    Im Klassendiagramm bekommen Eigenschaften daher ein vorgestelltes und Methoden ein +


Übung
  1. Skat
    1. Was sind Eigenschaften der Klasse Kartenspiel?
    2. Was sind die Methoden?
    3. Legen Sie ein Klassendiagramm an.
  2. Nennen Sie Eigenschaften und Methoden des Objektes Kaffeemaschine.
    1. Legen Sie einKlassendiagramm 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.

besitzerName und kontostand 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 (Datentyp) für jedes Attribut gefordert.

Java kennt verschiedene Datentypen. Zwei für unseren Zweck geeignete sind String und double.

Zeichenketten, also Aneinanderreihungen von Zeichen, werden in Java mit dem Datentypen String deklariert. Der Datentyp String eignet sich als Datentyp für besitzerName, da dieser aus beliebigen Zeichen der Tastatur besteht und nicht etwa eine Zahl ist.

Als Typ des Kontostands kontostand bevorzugen wir einen numerischen Datentypen. double 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 double 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?

Eine moderne Waschmaschine

public und private' regeln die Zugriffsrechte (Fachbegriff: Zugriffsmodifizierer). Vergleichbar ist das mit dem Zugriff auf eine Waschmaschine:

  • Die Bedienknöpfe sind public, also öffentlich und von jedem bedienbar.
  • Das Innenleben ist private. 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)


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:

Onlinebank1.png

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".


Onlinebank2.png
 public class Konto {
 private String besitzerName;
 private double kontostand;
 }

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 new Konto() wähle.


Onlinebank3.png

Ich wähle den vorgegebenen Instanznamen Konto1 und schon habe ich mein Objekt, welches BlueJ unten links als rotes Rechteck visualisiert.

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.

Onlinebank5.png

Zusammenfassung

  • Eine Klasse (be-)schreibt man in BlueJ mit Hilfe eines Quelltextes. Der grundsätzliche minimale Aufbau ist:
public class Klassenname {
  // Eigenschaften
  private Datentyp eigenschaft1; 
  private Datentyp eigenschaft2;
}
  • Die Zugriffsmodifizierer public und private regeln die Zugriffsrechte. Als vorläufige Regel ist die Klasse immer public und die Eigenschaften sind immer private.
  • 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 null und von Zahlentypen 0.
  • Ein „Doppelslash“ // 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
  1. Erweitern Sie die Klasse Konto um die Attribute kreditlimit und telefonnummer. Welche Datentypen würden Sie verwenden?
  2. Entwerfen Sie das Klassendiagramm zur Klasse Konto. Entwerfen Sie den Quelltext zur Klasse Vogel.
  3. 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:

public class Konto {
  // (Instanzvariablen der) Eigenschaften 
  private String besitzerName;
  private double kontostand;
  //Konstruktor
  public Konto (String pBesitzerName){
    besitzerName = pBesitzerName;  
    kontostand = 1.0; 
  }
}
Begriff Erläuterung
Konstruktor legt die Anfangswerte fest. Er erhält den gleichen Namen wie die Klasse selbst: z.B. public Konto
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. pBesitzerName
null Ist ein leeres Objekt. Es zeigt an, wenn eine Variable bzw. ein Objekt nicht mit einem Wert belegt wurde.
geschweifte Klammern { } 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.

Hinweis
Im Quelltext meide ich deutsche Umlaute oder Sonderzeichen als Variablennamen.
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; 
  }
}


Übung
  1. Vollziehen Sie das angegebene Beispiel nach. Testen Sie Fehleingaben bei BlueJ: Lassen Sie beim Besitzernamen die Anführungstsriche weg, geben Sie eine Zahl, geben Sie nichts ein …
  2. Lassen Sie statt des Namens den Kontostand als Parameter übergeben.
  3. Ergänzen Sie die Eigenschaften vorname, telefonnummer, postleitzahl, geburtsjahr, geschlecht und hausnummer. Begründen Sie dabei, welche Datentypen Sie verwenden.


Methoden – Was kann meine Klasse? =

Die Methode einzahlen() als Beispiel für eine verändernde Methode

Es sind natürlich noch viele weitere Methoden möglich. Ein weiteres Beispiel ist die Methode einzahlen().

public void einzahlen(doublepBtrag){
  kontostand += pBetrag;      
  // oder kontostand = kontostand + pBetrag;
}<

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:

kontostand = kontostand + pBetrag;

Das bedeutet: kontostand wird die Summe aus dem bisherigen Kontostand und einem Parameter pBetrag zugewiesen.


Übung
  1. Bauen Sie die Methode einzahlen in Ihre Kontoklasse ein. Testen Sie das Einzahlen von negativen Beträgen, großen Beträgen, 0, Wörtern, Rechnungen...
  2. Entwerfen Sie auf Grundlage von einzahlen die Methode auszahlen().
  3. Entwerfen Sie raubeAus(), die den Kontostand auf 0 setzt.



Zuweisen von Werten bei Variablen
Hervorhebung

Die set-Methoden als Bspl. für verändernde Methode ohne Rückgabewert

Diese einfache Methode verändert den Namen des Kontobesitzers. Eine Methode ohne Rückgabewert wird mit public void (void entspricht im englischen etwa: nichts) eingeleitet.

public void setBesitzerName(String pNeuerName){
  besitzerName = pNeuerName; 
}

Die get-Methoden als Beispiel für sondierende Methoden

Eine ebenso einfache Methode liest den Namen des Kontobesitzers wieder aus:

public String getBesitzerName(){
  return besitzerName;
}


Merke

Wann schreibe ich void?

  • void kommt bei einer Methodendeklaration immer dann vor, wenn es keine Rückgabe gibt.
  • return Gibt es eine Rückgabe (return variable), so muss der Datentyp des Rückgabewertes eingetragen werden.


Übung
  1. Schreiben Sie die get- und set-Methode zu der Eigenschaft kontostand.
  2. Schreiben Sie die Methode bucheZinsen (double zinssatz), die auf den vorliegenden Kontostand zinssatz, Prozent, Zinsen addiert.
  3. Zeichnen Sie das Klassendiagramm zu der aktuellen Klasse Konto.


Weblinks