1.11k likes | 1.46k Views
Objektorientierte Programmierung. primitiverDatentyp. Bis jetzt in Java:. Variable. <--->. In Java darf man einen Datentyp selbst basteln Dieser heisst dann:. Objekt-variable. Klasse. <--->. ist eineVariable.
E N D
primitiverDatentyp Bis jetzt in Java: Variable <---> In Java darf man einen Datentyp selbst basteln Dieser heisst dann: Objekt-variable Klasse <---> ist eineVariable
Es gibt jetzt also zwei verschiedene Typen:1) primitive Datentypen 2) Klassentyp (kurz Klasse)=höherer, selbstgebastelter Datentyp
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.
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.
Klasse <---> Objekt-variable Geburts- tagskuchen von Rolf Backform Marmor- kuchen
Klasse <---> Objekt-variable hausMaier FertighausS
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.
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!!
Eine Klasse enthält Datenund Methoden.Die Daten heissen Attribute, Der Sammelbegriff für Daten und Methoden ist Member (Mitglieder).
Sinn:Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ändern der Attribute)
Uns bereits bekannt ist die Methode main(...). Eine Methode kann man als ein Unterprogramm auffassen, das bestimmte Anweisungen ausführt.
Input-Parameter Output-Parameter Black Box
Input - Schnittstellenkanal Methode: mini Minimum von zahl1 und zahl2 zahl1 zahl2 Output - Schnittstellenkanal
WICHTIG:Die Schnittstellenkanäle bzw. Input und Output werden hier durch Variablen realisiert.
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.
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).
Recht des Entwicklers:Wenn der Vertragspartner (Auftraggeber) seine Pflichten nicht erfüllt, haftet der Entwickler nicht für die sich daraus ergebenden Konsequenzen.
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?
Er muss ein Fernsehprogramm auswählen.Er muss – ganz allgemein - den Input der Black-Box "füttern".
Er muss den Input-Parametern zahl1 und zahl2 bestimmte Werte zuweisen.
Dies ist der Datentyp des Outputs. Den Output garantiert der Entwickler. Hier ist der Aufgabenbereich des Nutzers. Er muss diese sogenannten formalen Parameter mit Werten bestücken. int mini(int zahl1, int zahl2){} // Hier ist der // Aufgabenbereich // des Entwicklers. Er muss // hier die dazu nötigen // Anweisungen schreiben.
Zur besseren Vorstellung kann man sich einen möglichen Output wie folgt vorstellen:
mini(13,2); 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). min1
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.
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 Attributname vom Typ double Methode setName Attributname vom Typ String 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. Methode getName
public void setGewicht(double pGewicht){ gewicht = pGewicht; } public double getGewicht(){ return(gewicht); } public void bellen(){ System.out.println("\u0007"); }} Methode setGewicht Methode getGewicht Vereinbarung zwischen den Programmierern:Der erste Buchstabe eines formalen Parameters soll mit p beginnen:p wie Parameter! Methode bellen
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.
private und public sind Bezeichner. Man nennt sie Sichtbarkeits- und Zugriffsmodifizierer
class Hund{ private String name; private double gewicht; public void setName(String pName){ name = pName; } Typ der Methode 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.
class Hund{ private String name; private double gewicht; public String getName(){return(name); } Typ der Methode 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. Methode hat keinen formalen Parameter (Input-Parameter). Dies wird durch eine "leere" Klammer realisiert. Methode getName liefert einen Output: Wert des Attributs name.Der Output (es gibt nur einen!) wird durch den Bezeichner return veranlasst.
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.
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?
Zuerst mal etwas formales ... 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} Startklasse Fachklasse Alle Klassen mit Großbuchstaben beginnen! Ü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.
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
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} Die Variable myh1 wird deklariert. Mit new wird Speicher für das jetzt neu angelegte Objekt reserviert. 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.
public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(12); // ... }} Wie funktioniert dieser Mechanismus der Parameterübergabe? Eine Objektvariable und die Methode muss durch einen Punkt voneinander getrennt werden. Die Methoden setName und setGewicht werden aufgerufen. Der sogenannte aktuelleParameter ist "Goldi" bzw. 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.
Was geschieht ganz genau beim Aufruf der Methodemyh1.setName("Goldi");
Der konkrete Wert des Input-Parameters (nämlich "Goldi") wird in den formalen Parameter pName kopiert. pName="Goldi" (Kopie) myh1.setName("Goldi"); name = pName; Kurznotation: "Goldi" Welchen Wert hat also pName? "Goldi" Welchen Wert bekommt dann das Attribut name zugewiesen? Diese Beschreibung ist noch nicht ganz richtig (weil pName einen Klassentyp hat). Näheres dazu später.
Was geschieht ganz genau beim Aufruf der Methodemyh1.setGewicht(12);
Der konkrete Wert des Input-Parameters (nämlich 12 wird in den formalen Parameter pGewicht kopiert. pGewicht=12 (Kopie) myh1.setGewicht(12); gewicht = pGewicht; Kurznotation: 12 12 Welchen Wert hat also pGewicht? Welchen Wert bekommt dann das Attribut gewicht zugewiesen?
Was geschieht ganz genau beim Aufruf der MethodemyName=myh1.getName();