Objektorientierte Programmierung

107
Objektorientiert e Programmierung

description

Objektorientierte Programmierung. primitiverDatentyp. Bis jetzt in Java:. Variable. . In Java darf man einen Datentyp selbst basteln Dieser heisst dann:. Objekt-variable. Klasse. . ist eineVariable. - PowerPoint PPT Presentation

Transcript of Objektorientierte Programmierung

Page 1: Objektorientierte Programmierung

ObjektorientierteProgrammierung

Page 2: Objektorientierte Programmierung

Bis jetzt in Java:primitiverDatentyp Variable<--->

Klasse <---> Objekt-variable

ist eineVariable

In Java darf man einenDatentyp selbst basteln

Dieser heisst dann:

Page 3: Objektorientierte Programmierung

Es gibt jetzt also zwei verschiedene Typen:1) primitive Datentypen 2) Klassentyp (kurz Klasse)=höherer, selbstgebastelter Datentyp

Page 4: Objektorientierte Programmierung

Eine Klasse ist ein Bauplan (Schablone, Objektfabrik) (anschaulich: Backform) .In diesem Bauplan steht

genau beschrieben, wie ein konkretes Objekt, das nach diesem Bauplan gebastelt

wird, auszusehen hat.

Page 5: Objektorientierte Programmierung

Mit dieser Backform können dann ganz konkret z.B.

Marmorkuchen gebacken werden.

In der Fachsprache sagt man: Ein Objekt ist eine Instanz

einer Klasse.

Page 6: Objektorientierte Programmierung

Beispiel:

Page 7: Objektorientierte Programmierung

BackformMarmor-kuchen

Geburts-tagskuchen von Rolf

Klasse <---> Objekt-variable

Page 8: Objektorientierte Programmierung

Weiteres Beispiel:

Page 9: Objektorientierte Programmierung

FertighausS hausMaier

Klasse <---> Objekt-variable

Page 10: Objektorientierte Programmierung

Herr Maier will ein Fertighaus des Modelltyps FertighausS (S wie super) kaufen.Die Klasse FertighausS stellt einen Bauplan dar (der z.B. von einem Architekten gezeichnet wurde). An Hand dieses Bauplans wird nun an einer bestimmten Stelle der Erde (=Arbeitsspeicher) eine bestimmte Menge Raum (z.B. Bauplatz in Kirchheim Stuttgarterstr. 137) reserviert (dem man z.B. den Namen hausMaier gibt). Dann wird dieses konkrete Stück Raum nach der Vorschrift des Bauplans "formatiert" (bearbeitet), indem dort die Fertigteile des Hauses genau nach dem Bauplan FertighausS zusammengesetzt werden.Der Bauplan verlangt zum Beispiel u.a. , dass sich der Getränkekeller neben dem Schlafzimmer befindet, 10 m breit und 12 m lang ist, also eine zentrale Rolle einnimmt.

Page 11: Objektorientierte Programmierung

Sehr WICHTIG:Man muss unterscheiden zwischen dem Bauplan (nur eine Beschreibung) und dem konkreten Objekt (= Haus), in dem man nachher wohnen und leben kann.Zu einem Bauplan kann es mehrere Objekte geben!!

Page 12: Objektorientierte Programmierung

Eine Klasse enthält Daten und Methoden.

Die Daten heissen Attribute, Der Sammelbegriff für Daten und Methoden ist Member (Mitglieder).

Page 13: Objektorientierte Programmierung

Sinn:Mit Hilfe der Methoden soll

man auf die Attribute zugreifen (lesen bzw. ändern

der Attribute)

Page 14: Objektorientierte Programmierung

Uns bereits bekannt ist die Methode main(...).

Eine Methode kann man als ein Unterprogramm

auffassen, das bestimmte Anweisungen ausführt.

Page 15: Objektorientierte Programmierung

Methoden kann man systemisch als

Black-Boxauffassen

Page 16: Objektorientierte Programmierung

Input-Parameter

Output-Parameter

Black

Box

Page 17: Objektorientierte Programmierung

Input - Schnittstellenkanal

Output - Schnittstellenkanal

Methode:

mini

zahl1

zahl2

Minimum von zahl1 und zahl2

Page 18: Objektorientierte Programmierung

WICHTIG:Die Schnittstellenkanäle bzw. Input und Output

werden hier durch Variablen realisiert.

Page 19: Objektorientierte Programmierung

Wenn man eine Black-Box (wie z.B. einen Fernseher) nutzen will, gibt es eine unausgesprochene Vereinbarung (Vertrag) zwischen dem Auftraggeber (Nutzer) der Black-Box und dem Auftragnehmer (Entwickler) der Black-Box.

Page 20: Objektorientierte Programmierung

Jeder der Vertragsnehmer hat Pflichten und Rechte:

Page 21: Objektorientierte Programmierung

Pflicht des Entwicklers:Der Entwickler der Black-Box trägt zur Nutzung dieser dadurch bei, indem er die Funktionsweise der Black-Box garantiert (insbesondere muss der Nutzer keine Kenntnisse von den "Innereien" der Black-Box haben).

Page 22: Objektorientierte Programmierung

Recht des Entwicklers:Wenn der Vertragspartner (Auftraggeber) seine Pflichten nicht erfüllt, haftet der Entwickler nicht für die sich daraus ergebenden Konsequenzen.

Page 23: Objektorientierte Programmierung

Frage:Durch was trägt der Nutzer der Black-Box zur Nutzung dieser bei?Was muss er machen, wenn er diese nutzen will (z.B. Fernsehapparat)? Konkret: Was sind seine Pflichten?

Page 24: Objektorientierte Programmierung

Er muss ein Fernsehprogramm auswählen.Er muss – ganz allgemein - den Input der Black-Box "füttern".

Page 25: Objektorientierte Programmierung

Was muss er bei der Nutzung der Methode mini also machen?

Page 26: Objektorientierte Programmierung

Er muss den Input-Parametern zahl1 und zahl2 bestimmte Werte zuweisen.

Page 27: Objektorientierte Programmierung

Beispiel einer Methode:

Page 28: Objektorientierte Programmierung

int mini(int zahl1, int zahl2){

}

Hier ist der Aufgabenbereich des Nutzers. Er muss diese sogenannten

formalen Parameter mit Werten bestücken.

Dies ist der Datentyp des Outputs. Den Output garantiert der Entwickler.

// Hier ist der // Aufgabenbereich // des Entwicklers. Er muss // hier die dazu nötigen // Anweisungen schreiben.

Page 29: Objektorientierte Programmierung

Zur besseren Vorstellung kann man sich einen

möglichen Output wie folgt vorstellen:

Page 30: Objektorientierte Programmierung

mini(13,2);

min1

Ein Zapfhahn wird in den Aufruf angebracht.

Die Anzahl der Tropfen (bzw. der Flüssigkeit), d.h. min(13,2) wird ....

in einem Behälter (einer Variablen) mit z.B. dem Namen min1 aufgefangen (abgespeichert).

Page 31: Objektorientierte Programmierung

Beispiel einer Klasse:

Page 32: Objektorientierte Programmierung

Angenommen, wir sind im Jahre 2789. Viele Tierarten sind schon ausgestorben und deshalb

versuchen Gentechniker den Bauplan eines Hundes wieder zu konstruieren und an Hand

dieses Bauplans einzelne dieser Hunde zu produzieren.

Page 33: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; } public String getName(){ return(name); } // nächste Folie geht es weiter

Name der Klasse

privater Bereich: Auf die Member des privaten Bereichs kann außerhalb (d.h. von

einer anderen Klasse) nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden.

Direkter Zugriff ist nur innerhalb der Klasse möglich.öffentlicher Bereich:

Auf die Member dieses Bereichs kann man jederzeit zugreifen.

Attributname vom Typ String

Attributname vom Typ double

Methode setName

Methode getName

Page 34: Objektorientierte Programmierung

public void setGewicht(double pGewicht){ gewicht = pGewicht; }

public double getGewicht(){ return(gewicht); }

public void bellen(){ System.out.println("\u0007"); }}

Methode setGewicht

Methode getGewicht

Methode bellen

Vereinbarung zwischen den Programmierern:

Der erste Buchstabe eines formalen Parameters soll mit p beginnen:

p wie Parameter!

Page 35: Objektorientierte Programmierung

public void setGewicht(double pGewicht){ gewicht = pGewicht; }

public double getGewicht(){ return(gewicht); }

public void bellen(){ System.out.println("\u0007"); }}

Das ASCII-Zeichen mit dem ASCII-Wert 7 bedeutet "normalerweise" einen Alarmton. Wenn dieses Programm allerdings innerhalb der Entwicklungsumgebung Eclipse

ausgeführt wird, schluckt deren Konsole den Ton des Lautsprechers und gibt ein Platzhalterzeichen aus. Deswegen kann man das Programm in der Eingabeaufforderung ("DOS-Fenster")

mit Java aufrufen. Dann wird auch der Ton des Lautsprechers erzeugt.

Page 36: Objektorientierte Programmierung

private und public sind Bezeichner.

Man nennt sie Sichtbarkeits- und Zugriffsmodifizierer

Page 37: Objektorientierte Programmierung

Schauen wir uns ein paar dieser Methoden genauer an:

Page 38: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; }

Methode setName liefert KEINEN Output. Dies wird durch den Bezeichner void

realisiert.

Der sogenannte formale Parameter ist ein Input-Parameter, weil er einen reinen Input darstellt. Dies nennt man auch call by value Der Input pName wird dem

Attribut name zugewiesen und dort abgespeichert.

Typ der Methode

Page 39: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public String getName(){ return(name); }

Methode getName liefert einen Output: Wert des Attributs name.Der Output (es gibt nur einen!) wird durch den Bezeichner return

veranlasst.

Typ der Methode

Methode hat keinen formalen Parameter (Input-Parameter). Dies wird durch eine "leere" Klammer realisiert.

return veranlasst, dass der Wert des Attributs name zurückgegeben wird und

danach die Methode sofort verlassen wird. Damit sind also mehrere Rückgaben

nicht möglich.

Page 40: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; } public String getName(){ return(name); } // weiter wie vorher

Man kann sich die Attribute einer Klasse als Speicherstellen einer Black-Box vorstellen. In einer Speicherstelle der Black-Box

Fernsehapparat könnte z.B. der Sender stehen, der am Öftesten (seit Erstbenutzung des Apparats) gewählt wurde.

Page 41: Objektorientierte Programmierung

Bis jetzt haben wir nur den Bauplan eines Hundes

gebastelt, aber noch keinen Hund erzeugt (bzw. eine

Zeugung veranlasst). Wie werden ein oder

mehrere Hunde nach dem Bauplan erzeugt?

Page 42: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ double myGewicht; String myName; Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); myName=myh1.getName(); myGewicht=myh1.getGewicht(); System.out.println("Name: "+myName); System.out.println("Gewicht: "+myGewicht); }}

class Hund{ // wie vorher}

Alle Klassen mit Großbuchstaben beginnen!

Zuerst mal etwas formales ...

Übrigens:Der Name der (Haupt)Klasse - wir nennen sie

in Zukunft Startklasse - in der das Hauptprogramm main steht, muss den

gleichen Namen haben wie die Datei, in der diese (Haupt)Klasse steht.

StartklasseFachklasse

Page 43: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ double myGewicht; String myName; Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); myName=myh1.getName(); myGewicht=myh1.getGewicht(); System.out.println("Name: "+myName); System.out.println("Gewicht: "+myGewicht); }}

class Hund{ // wie vorher}

Aus Platzgründen wurde die Variable mit myh1 abgekürzt. Bitte nicht nachmachen!!!!!Selbstsprechenden Namen benutzen: myHund1

Page 44: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ double myGewicht; String myName; Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); myName=myh1.getName(); myGewicht=myh1.getGewicht(); System.out.println("Name: "+myName); System.out.println("Gewicht: "+myGewicht); }}

class Hund{ // wie vorher}

Genauer:Die Klasse Hund stellt einen Bauplan dar (ähnlich dem Bauplan eines Architekten). An Hand dieses Bauplans wird nun ein konkreter Hund (= ein Objekt) mit dem Namen myh1 erzeugt. Der Bauplan verlangt: 1) dass im Arbeitsspeicher eine bestimmte Menge Bytes für den Hund reserviert werden.2) dass diese Bytes nach der Vorschrift des Bauplans angeordnet, "formatiert", angelegt, werden, d.h. z.B. dass in den ersten 8 Bytes das Gewicht des angelegten Hundes als double-Zahl gespeichert werden und in den nachfolgenden Bytes der Name des angelegten Hundes gespeichert werden.

Die Variable myh1 wird deklariert.

Mit new wird Speicher für das jetzt neu angelegte Objekt reserviert.

Page 45: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); // ... }}

Dem mit myh1 bezeichneten Objekt wird durch den aktuellen Parameter "Goldi" in

der Methode setName der Name zugewiesen, den der Nutzer der Black-Box

laut Vertragsbedingung festlegen muss.

Dem mit myh1 bezeichneten Objekt wird durch den aktuellen Parameter 12 in der Methode setGewicht das Gewicht zugewiesen, das

der Nutzer der Black-Box laut Vertragsbedingung festlegen muss.

Eine Objektvariable und die Methode muss durch einen Punkt

voneinander getrennt werden.

Wie funktioniert dieser Mechanismus der

Parameterübergabe?

Die Methoden setName und setGewicht werden

aufgerufen. Der sogenannte aktuelle

Parameter ist "Goldi" bzw. 12

Page 46: Objektorientierte Programmierung

Was geschieht ganz genau beim Aufruf der Methode

myh1.setName("Goldi");

Page 47: Objektorientierte Programmierung

name = pName;

myh1.setName("Goldi");pName="Gol

di"(Kopie)

Der konkrete Wert des Input-Parameters (nämlich "Goldi") wird in den formalen Parameter pName kopiert.

Kurznotation:

Welchen Wert hat also pName?

"Goldi"

Welchen Wert bekommt dann das Attribut name zugewiesen?

"Goldi"

Diese Beschreibung ist noch nicht ganz richtig (weil pName einen Klassentyp hat). Näheres dazu später.

Page 48: Objektorientierte Programmierung

Was geschieht ganz genau beim Aufruf der Methode

myh1.setGewicht(12);

Page 49: Objektorientierte Programmierung

gewicht = pGewicht;

myh1.setGewicht(12);pGewicht=1

2(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 12 wird in den formalen Parameter pGewicht kopiert.

Kurznotation:

Welchen Wert hat also pGewicht?

12

Welchen Wert bekommt dann das Attribut gewicht zugewiesen?

12

Page 50: Objektorientierte Programmierung

Was geschieht ganz genau beim Aufruf der Methode

myName=myh1.getName();

Page 51: Objektorientierte Programmierung

return(name);

myName = myh1.getName();

Es gibt keinen Input-Parameter (also muss auch nichts kopiert werden)

Welchen Wert hat aktuell das Attribut name?

"Goldi"

Auf diesen Wert wurde es vor ein paar Folien gesetzt!

"Goldi"

Welchen Wert hat also myName?

Page 52: Objektorientierte Programmierung

Den Methodenaufruf:myName myh1.getName();

kann man sich als einen Kanal vorstellen, der den Output von rechts nach links transportiert.

Page 53: Objektorientierte Programmierung

Was geschieht ganz genau beim Aufruf der Methode

myGewicht=myh1.getGewicht();

Page 54: Objektorientierte Programmierung

return(gewicht);

myGewicht = myh1.getGewicht();

Es gibt keinen Input-Parameter (also muss auch nichts kopiert werden)

Welchen Wert hat aktuell das Attribut gewicht?

12

Auf diesen Wert wurde es vor ein paar Folien gesetzt!

12

Welchen Wert hat also myGewicht?

Page 55: Objektorientierte Programmierung

Der durch eine Methode gelieferte (erzeugte)

Output, kann selbst wieder innerhalb einer anderen

Methode verwendet werden, wie z.B:

Page 56: Objektorientierte Programmierung

Der von dieser Methode gelieferte Output kann direkt in der Methode System.out.println(...) verwendet werden. Der Output muss also ...

System.out.println("Gewicht="+ myh1.getGewicht());

System.out.println("Gewicht="+ myGewicht);nicht (kann aber) vorher in einer Variablen gespeichert werden.

Page 57: Objektorientierte Programmierung

Eine Bemerkung zu den Namen von Objekten ...

Page 58: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ // Hund myh1; new Hund(); new Hund().setName("Goldi"); new Hund().setGewicht(12); new Hund().getName(); new Hund().getGewicht(); }}

class Hund{ // wie vorher}

Das gleiche Programm, wie vorher, außer dass das Objekt keinen Namen bekommt. Was passiert ?

Es werden 5 verschiedene Hunde angelegt. Da jedes Objekt (Hund) nicht mit einer

Variablen bezeichnet wird (wie früher z.B. mit myh1), kann nur einmal auf dieses Objekt

(nämlich wenn es mit new angelegt wird) zugegriffen werden.

Page 59: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ // Hund myh1; new Hund(); new Hund().setName("Goldi"); new Hund().setGewicht(12); new Hund().getName(); new Hund().getGewicht(); }}

class Hund{ // wie vorher}

Das ist wie, wenn man im Urlaub (kurz vor der Abreise) nachts eine Person zum 1. Mal auf einer Party trifft, sie sympathisch findet und

tiefer kennen lernen will. Man schreibt sich die Telefonnummer von ihr auf, verliert diese aber aus Versehen. Dann ist der "Zugriff" auf diese Person nur einmal (nämlich auf dieser Party) möglich. Danach gibt es aber keinen Zugriff mehr, weil der Link bzw. Verweis nicht mehr

vorhanden ist.

Page 60: Objektorientierte Programmierung

Eine Frage zum Zugriff...

Page 61: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ double myGewicht; String myName; Hund myh1; myh1=new Hund(); // myh1.setName("Goldi"); // myh1.setGewicht(12); myh1.name="Goldi"; myh1.gewicht=12; }}

class Hund{ // wie vorher}

Warum meldet der Compiler einen Fehler?

name und gewicht sind als private deklarierte Attribute. Deshalb kann auf sie nicht von außerhalb (d.h. von einer anderen Klasse) zugegriffen werden.

Page 62: Objektorientierte Programmierung

Gerade wurden Zugriffe von außerhalb gemacht. Das sind

Zugriffe über eine Objektvariable, die durch einen Punkt von einem Member getrennt sind, wie z.B: myh1.setGewicht(12);

Page 63: Objektorientierte Programmierung

Zur vollständigen Klärung werden jetzt Zugriffe

innerhalb von Klassen (d.h. Methoden) vorgestellt.

Page 64: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; }

public String getName(){ return(name); }

public void setGewicht(double pGewicht){ gewicht = pGewicht; } // ...

Wo sind die Zugriffe (Aufruf von Methoden oder Benutzung von Attributen) innerhalb von Methoden?

Ein Aufruf einer Methode (in einer Methode) kommt hier nicht vor (siehe später).

Merke:

Page 65: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; }

public String getName(){ return(name); }

public void setGewicht(double pGewicht){ gewicht = pGewicht; } // ...

privater Bereich: Zugriff von außerhalb der Klasse: neinZugriff innerhalb der Klasse: ja

public (öffentlicher) Bereich : Zugriff von außerhalb der Klasse: jaZugriff innerhalb der Klasse: ja

Page 66: Objektorientierte Programmierung

Zugriff von innerhalb auf das

Objekt selbst

Page 67: Objektorientierte Programmierung

Wie kann man in einer Methode auf das mit new erzeugte Objekt zugreifen (sozusagen von innen)?

Woher weiß die Methode den Namen des Objekts?

Page 68: Objektorientierte Programmierung

Die Methode kann den Namen nicht wissen, weil im Bauplan

nicht schon der Name des Objekts stehen kann, das

irgendein Programmierer später (nach der Erstellung des

Bauplans) dem Objekt beim Anlegen mit new .. vergibt!

Page 69: Objektorientierte Programmierung

Um trotzdem innerhalb eines Objekts auf das Objekt selbst zugreifen zu können, wird in

Java beim Zugriff auf das Objekt selbst der Name this

verwendet.

Page 70: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ name = pName; }

public String getName(){ return(name); }

public void setGewicht(double pGewicht){ gewicht = pGewicht; } // ...

Wie könnte man dann also noch auf die Attribute name

und gewicht zugreifen?

Page 71: Objektorientierte Programmierung

class Hund{ private String name; private double gewicht;

public void setName(String pName){ this.name = pName; }

public String getName(){ return(this.name); }

public void setGewicht(double pGewicht){ this.gewicht = pGewicht; } // ...

Page 72: Objektorientierte Programmierung

Beispiel (aus dem "Alltag"), um sich public und private

besser vorstellen bzw. merken zu können.

Page 73: Objektorientierte Programmierung

Die Küche einer Gaststätte ist private. Die Bedienungen (Methoden) sind alle public.

Von außerhalb (z.B. telefonische Bestellung) kann nicht direkt auf ein Gericht in der Küche zugegriffen werden, sondern nur indirekt über die Bedienungen (public).Beispiel eines Zugriffs:Bahnhofsgaststätte-Kirchheim.bestellen(Gericht Nr 13)

Von innerhalb (also von allen Bedienungen) kann direkt auf das Gericht in der Küche zugegriffen werden.Beispiel eines Zugriffs:Die Bedienung geht in die Küche und leert – weil sie von dem "Gast" beleidigt wurde - eine hohe Dosis eines Abführmittels auf das von ihm bestellte Gericht.

Page 74: Objektorientierte Programmierung

Unter den Programmierern gibt es folgende stillschweigende Vereinbarung:

Page 75: Objektorientierte Programmierung

Methoden, in denen Attribute auf bestimmte Werte gesetzt werden, mit set zu beginnen und Methoden, in denen die

Werte von Attributen besorgt werden, mit get zu beginnen.

Page 76: Objektorientierte Programmierung

Übung:Am Ende eines jeden Jahres summiert

der Hundehalter alle Ausgaben für seinen Hund und will aus dieser Zahl

die monatlichen Kosten seines Hundes berechnen.

Page 77: Objektorientierte Programmierung

Aufgabe:1) Geben Sie in main(...) die jährlichen Kosten für den Hund über Tastatur ein.2) Implementieren Sie die Methode getMonatlicheKosten(...), in welcher die monatlichen Kosten des Hundes berechnet werden.3) Geben Sie in main(...) das Ergebnis auf dem Bildschirm aus.

Page 78: Objektorientierte Programmierung

Lösung1) Besprechung der Methode

Page 79: Objektorientierte Programmierung

public double getmKosten(double pKosten){ double kosten; kosten=pKosten/12.0; return(kosten);}

formale Parameter pKosten

Der Output liefert die monatliche Kosten des

Hundes

Dies ist eine sogenannte lokale Variable. Sie wird verwendet um Werte innerhalb der Methode zwischenzuspeichern. Diese Variable ist - genauso wie der formale Parameter pKosten - außerhalb der Methode unsichtbar, weil die Black-Box undurchsichtig ist. Genauso wie die Innereien eines Fernsehapparats (Platinen, Widerstände, usw.) außerhalb des Apparats für den Nutzer unsichtbar sind.

Aus Platzgründen wurde die Methode monatlicheKosten mit getmKosten abgekürzt. Bitte nicht nachmachen!!!!!

Page 80: Objektorientierte Programmierung

public double getmKosten(double pKosten){ double kosten; kosten=pKosten/12.0; return(kosten);}

BemerkungDie berechneten monatlichem Kosten werden hier nicht in einem Attribut gespeichert. Man könnte das machen, muss es aber nicht machen. Dies ist eine Sache des sogenannten Designs, das der Entwickler festlegt und zu dem es "eigene Philosophien" gibt.

Page 81: Objektorientierte Programmierung

Erstellen Sie die Methode monatlicheKosten() ohne Verwendung einer lokalen

Variablen.

Page 82: Objektorientierte Programmierung

public double getmKosten(double pKosten){ return(pKosten/12.0);}

Eine lokale Variablen kann man mit einem Zimmer vergleichen, das man (eine kurze Zeit) mietet.Ein Attribut kann man mit einem Zimmer vergleichen, das man längere Zeit mietet oder kauft.

Page 83: Objektorientierte Programmierung

Lösung2) Gesamte Programm

Page 84: Objektorientierte Programmierung

import java.io.*;import java.util.Scanner;public class MainKlassen1 { public static void main(String[] args) throws IOException{ Hund myh1; double jKosten; double mKosten; Scanner scanner; scanner = new Scanner(System.in); System.out.println("Jahreskosten eingeben"); jKosten = scanner.nextDouble(); myh1 = new Hund(); myh1.setName("Goldi"); mKosten = myh1.getmKosten(jKosten); System.out.println("Monatskost.: "+mKosten); }}

Der aktuelle Parameter jKosten muss keine Konstante - wie z.B. 3.0 - sein, er kann auch - wie hier - eine Variable sein!!

Was sind dies für Variablen ?

lokale Variablen!

Page 85: Objektorientierte Programmierung

class Hund{ // Alles wie vorher... private String name; private double gewicht;

public void setName(String pName){ name = pName; }

public String getName(){ return(name); }

public void setGewicht(double pGewicht){ gewicht = pGewicht; }

public double getGewicht(){ return(gewicht); }

Page 86: Objektorientierte Programmierung

public void bellen(){ System.out.println("WauWau"); System.out.println("\u0007"); }

// Die Methode getmKosten kommt jetzt // in der Klasse Hund neu dazu

public double getmKosten(double pKosten){ double kosten; kosten=pKosten/12.0; return(kosten); }}

Page 87: Objektorientierte Programmierung

Was geschieht ganz genau beim Aufruf der Methode

mKosten=myh1.getmKosten(jKosten);

Wir nehmen dazu an, der Anwender hätte über Tastatur den

Wert 240.0 eingegeben.

Page 88: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240

Page 89: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240

Page 90: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240

Page 91: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240

Page 92: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240

Page 93: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation: 240

Page 94: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation: 240

Page 95: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation: 240

Page 96: Objektorientierte Programmierung

double kosten;

kosten=pKosten/12.0;

return(kosten);

mKosten=myh1.getmKosten(jKosten);pKosten=24

0(Kopie)

Der konkrete Wert des Input-Parameters (nämlich 240.0 wird in den formalen Parameter pKosten kopiert.

Kurznotation:

240Welchen Wert bekommt

dann kosten?

20

20Welchen Wert hat also mKosten?

20

Page 97: Objektorientierte Programmierung

Überladen von Methoden und

Signatur einer Methode

Page 98: Objektorientierte Programmierung

In Java kann der gleiche Methodenname für unterschiedliche Methoden verwendet werden, vorausgesetzt die Signatur der Methode ist verschieden.

Page 99: Objektorientierte Programmierung

Die Signatur einer Methode ist gekennzeichnet durch die Anzahl und/oder den jeweiligen Datentyp der Parameter der Methode. Der Rückgabetyp der Methode gehört nicht zur Signatur.

Page 100: Objektorientierte Programmierung

Beispiele:

Page 101: Objektorientierte Programmierung

Sind folgende Methoden gleichzeitig innerhalb der gleichen Klasse möglich? Warum ?void drucke(int i, int j){ ... }

void drucke(char c){ ...}

void drucke(int i, char c){ ...}

Page 102: Objektorientierte Programmierung

Ja ! Die Signatur ist jeweils verschieden

Page 103: Objektorientierte Programmierung

Parameterübergabe und Konvertierung

Page 104: Objektorientierte Programmierung

Wenn eine Methode verlangt, dass ein Parameter einen primitiven Datentypen wie z.B. double haben muss, aber beim Methodenaufruf ein integer Wert benutzt wird, dann wird der "kleinere" Datentyp (hier also int) automatisch in den "größeren" Datentyp konvertiert (impliziter cast).

Page 105: Objektorientierte Programmierung

Beispiel (siehe Klasse Hund):Es soll der Hund Bello mit 10.5 Kg

Gewicht erzeugt werden.Anschließend soll dieses Gewicht

auf 15 Kg abgeändert werden (Hund hat zugenommen).

Page 106: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(10.5); myh1.setGewicht(15); }}

class Hund{ // wie vorher}

10.5 ist ein Literal und hat den Datentyp double. Laut der Deklaration der Methode setGewicht(...) muß er auch diesen Datentyp haben.

Welchen Datentyp hat dieser aufrufende (aktuelle) Parameter und welchen Datentyp müsste er laut Deklaration der Methode setGewicht(...) haben?

Page 107: Objektorientierte Programmierung

public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(10.5); myh1.setGewicht(15); }}

class Hund{ // wie vorher}

15 ist ein Literal und hat den Datentyp integer. Laut der Deklaration der Methode setGewicht(...) müsste er aber den Datentyp double haben.

Der Compiler müsste also streng genommen eine Fehlermeldung bringen ....

Er macht dies allerdings nicht, sondern wandelt automatisch den „kleineren“ Datentyp integer (also konkret 15) in den „größeren“

Datentyp double (also konkret 15.0) um!

Welchen Datentyp hat dieser aufrufende (aktuelle) Parameter und welchen Datentyp müsste er laut Deklaration der Methode setGewicht (...) haben?