Konstruktoren.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Konzepte objektorientierter Systeme
Definition von Klassen in Java
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Java: Objektorientierte Programmierung
Java: Grundlagen der Sprache
Java: Grundlagen der Objektorientierung
Vererbung.
SWITCH - Anweisung.
Abstrakte Klassen.
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
Objektorientierte Programmierung
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Vererbung. Das Prinzip der Vererbung im täglichen Leben:
Polymorphie (Vielgestaltigkeit)
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
ARRAY oder FELD oder VEKTOR
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Zusammenfassung Vorwoche
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Objektorientierte Modellierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Die Klasse String und ihre Methoden
EPROG Tutorium #3 Philipp Effenberger
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Instanzmethoden
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Einführung in die Programmierung mit Java
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Klassenvariable.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Hello World! Javakurs 2013 Arne Kappen
Aufgaben zu Rückgabewerten
ARRAY oder FELD oder VEKTOR
Java-Kurs - 2. Übung primitive Datentypen, Konstanten
Grundkurs Informatik 11-13
Vererbung.
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Ein Referat von Sabrina Vissel, darleen paul und yannick fuchs
Definition Felder Konstruktor Methoden Beispiel
9. Vererbung und Polymorphie
Implementieren von Klassen
Datentyp- umwandlung.
 Präsentation transkript:

Konstruktoren

Um beim Anlegen eines Objekts gleichzeitig die Attribute mit Werten vorzubelegen (initialisieren), gibt es dazu eine besondere Möglichkeit:

Dies geschieht durch den sogenannten Konstruktor. Dies ist eine spezielle Methode in der Klasse mit dem gleichen Namen wie die Klasse, aber ohne einen Rückgabewert (auch nicht void).

Ein Konstruktor kann (wie jede andere Methode auch) überladen sein, d Ein Konstruktor kann (wie jede andere Methode auch) überladen sein, d.h. es kann mehrere Konstruktoren mit dem gleichen Namen, aber verschiedenen Parametern -bezogen auf die Anzahl und den Datentyp - geben

Konstruktor wird immer dann aufgerufen, wenn ein Objekt der Klasse instanziert (=angelegt) wird. Da ein und dasselbe Objekt nur einmal angelegt werden kann, kann für dieses Objekt auch der Konstruktor nur einmal aufgerufen werden.

Aufgabe: Erzeugen Sie für die uns bekannte Klasse Hund einen Konstruktor, einmal mit keinem bzw. mit zwei Parametern.

private double gewicht; public Hund(){ name="Musterhund"; gewicht=10; class Hund{ private String name; private double gewicht; public Hund(){ name="Musterhund"; gewicht=10; } public Hund(String pName, double pGewicht){ name=pName; gewicht=pGewicht; // restliche get und set-Methoden // wie früher Konstruktor hat keinen (auch nicht void) Rückgabewert. Konstruktor kann überladen sein Anschaulich: Mit dem Konstruktor kann man die Daten des Objekts "formatieren".

Beispiele für das Instanzieren von Objekten:

public class MainKlassen3 { public static void main(String[] args){ Hund myh1, myh2; String n1, n2; double g1, g2; myh1=new Hund(); myh2=new Hund("Goldi",12); n1=myh1.getName(); g1=myh1.getGewicht(); n2=myh2.getName(); g2=myh2.getGewicht(); } Konstruktor ohne Parameter wird mit Klammer (ohne Parameter) aufgerufen Konstruktor mit Parameter wird mit Klammern (mit 2 Parametern) aufgerufen

public class MainKlassen3 { public static void main(String[] args){ Hund myh1, myh2; String n1, n2; double g1, g2; myh1=new Hund(); myh2=new Hund("Goldi",12); n1=myh1.getName(); g1=myh1.getGewicht(); n2=myh2.getName(); g2=myh2.getGewicht(); } Welchen Wert hat das Objekt, auf das n1 zeigt? "Musterhund" Welchen Wert hat g1? 10 Welchen Wert hat das Objekt, auf das n2 zeigt? "Goldi" Welchen Wert hat g2? 12

public class MainKlassen3 { public static void main(String[] args){ Hund myh1, myh2; String n1, n2; double g1, g2; myh1=new Hund(); myh2=new Hund("Goldi",12); n1=myh1.getName(); g1=myh1.getGewicht(); n2=myh2.getName(); g2=myh2.getGewicht(); } Welchen Wert hat myh1.name ? "Musterhund" Welchen Wert hat myh1.gewicht ? 10 Welchen Wert hat myh2.name ? "Goldi" Welchen Wert hat myh2.gewicht ? 12 Welchen Wert haben folgende Attribute am Ende von main?

Da der Hund "Goldi" zu viel bellt soll er in "Bello" umbenannt werden Da der Hund "Goldi" zu viel bellt soll er in "Bello" umbenannt werden. Da er außerdem zu viel frißt, wiegt er mittlerweile 30 Kg. Realisieren Sie dies durch zwei Anweisungen.

Welchen Wert haben folgende Attribute am Ende von main? public class MainKlassen3 { public static void main(String[] args){ Hund myh1, myh2; String n1, n2; double g1, g2; myh1=new Hund(); myh2=new Hund("Goldi",12); n1=myh1.getName(); g1=myh1.getGewicht(); n2=myh2.getName(); g2=myh2.getGewicht(); } myh2.setName("Bello"); myh2.setGewicht(30); Welchen Wert haben folgende Attribute am Ende von main?

public class MainKlassen3 { public static void main(String[] args){ Hund myh1, myh2; String n1, n2; double g1, g2; myh1=new Hund(); myh2=new Hund("Goldi",12); n1=myh1.getName(); g1=myh1.getGewicht(); n2=myh2.getName(); g2=myh2.getGewicht(); } Die Attribute des Objekts, auf das myh2 zeigt wurden geändert. Die Attribute des Objekts, auf das myh1 zeigt wurden nicht geändert. Welchen Wert hat myh1.name ? "Musterhund" Welchen Wert hat myh1.gewicht ? 10 Welchen Wert hat myh2.name ? "Bello" myh2.setName("Bello"); myh2.setGewicht(30); Welchen Wert hat myh2.gewicht ? 30

Ein Konstruktor ohne Argumente (Parameter) wie z.B. Hund () heisst Standard-Konstruktor.

Implementiert der Programmierer für eine Klasse überhaupt keinen Konstruktor, dann erzeugt der Compiler automatisch einen Standard-Konstruktor, der als einzige Anweisung super() besitzt.

Bemerkung: Mit super() wird der Konstruktor der sogenannten Oberklasse aufgerufen. Dies wird später besprochen und braucht uns hier nicht zu interessieren.

Bei unseren bisherigen Beispielen hatten wir keine Konstruktoren implementiert. Deshalb wurde automatisch der Standardkonstruktor erzeugt.

Hat der Programmierer dagegen mindestens einen Konstruktor (egal mit 0, 1, 2,..., n Parametern) implementiert, erzeugt der Compiler keinen Standard-Konstruktor.

Beispiel:

Ja, weil der Compiler automatisch einen Standard-Konstruktor erzeugt. public class Maintest1 { public static void main(String[] args){ double g1; String n1; Hund myh1; myh1=new Hund(); g1=myh1.getGewicht(); n1=myh1.getName(); } // Klasse Hund wie früher, aber // ohne Konstruktor Ja, weil der Compiler automatisch einen Standard-Konstruktor erzeugt. Welche Werte haben g1 und n1 ? Da der Programmierer keinen Konstruktor implementiert hat, wird vom Compiler der Standard-Konstruktor erzeugt. Dieser hat keine Anweisung (außer super()). Deswegen haben die Attribute gewicht und name die Standardwerte. Das bedeutet bei einer double-Zahl der Wert 0.0 und bei einem Zeiger auf ein Objekt den Wert null. 0.0 null Ist dies korrekt ? Warum ?

standardmäßige Vorbelegung Datentyp standardmäßige Vorbelegung boolean false char \u0000 byte short int long 0L float 0.0f double 0.0 Referenz null

Beispiel:

public class Maintest1 { public static void main(String[] args){ double g1; String n1; Hund myh1; myh1=new Hund(); g1=myh1.getGewicht(); n1=myh1.getName(); } // Klasse Hund kommt gleich ...

private double gewicht; public Hund(String pName, double pGewicht){ class Hund{ private String name; private double gewicht; public Hund(String pName, double pGewicht){ name=pName; gewicht=pGewicht; } // weitere get- und set // Methoden wie früher } // Jetzt schauen wir uns nochmals // die Klasse MainTest1 an... Nur ein Konstruktor mit 2 Parametern, aber kein Standardkonstruktor.

public class Maintest1 { public static void main(String[] args){ double g1; String n1; Hund myh1; myh1=new Hund(); g1=myh1.getGewicht(); n1=myh1.getName(); } Nein, weil der Compiler keinen Standard-Konstruktor erzeugt. (da der Programmierer einen Konstruktor mit 2 Parametern erstellt hat). Ein Standard-Konstruktor wird aber beim Instanzieren bei: myh1=new Hund(); benötigt ! Ist dies korrekt ? Warum ?

WICHTIGE BEMERKUNGEN:

Innerhalb einer Methode einer Klasse soll nicht etwas berechnet (bzw Innerhalb einer Methode einer Klasse soll nicht etwas berechnet (bzw. Variablen verarbeitet) werden und gleichzeitig eine Bildschirmausgabe z.B. mit System.out.println(...) veranlaßt werden. Warum?

Weil dann diese Methode nicht in einer grafischen Oberfläche benutzt werden kann (keine Ausgabe in einem Textfeld oder einem eigenen Fenster).

Deswegen werden Eingaben bzw Deswegen werden Eingaben bzw. Ausgaben in jeweils eigenen Methoden gemacht.

Deswegen werden Eingaben bzw Deswegen werden Eingaben bzw. Ausgaben in jeweils eigenen Methoden gemacht.

Beispiel:

class Hund{ private String name; private double gewicht; public void setName(String pName){ name = pName; System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); } public String getName(){ System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); return(name); } // Konstruktoren und Methoden wie früher... Warum sind dies schlechte Lösungen?

class Hund{ private String name; private double gewicht; public void setName(String pName){ name = pName; System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); } public String getName(){ System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); return(name); } // Konstruktoren und Methoden wie früher... Weil sich das "Verarbeiten" der Daten und die Ausgabe innerhalb der gleichen Methode abspielen.

class Hund{ private String name; private double gewicht; public void setName(String pName){ name = pName; System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); } public String getName(){ System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); return(name); } // Konstruktoren und Methoden wie früher... Was ist eine bessere Lösung?

class Hund{ private String name; private double gewicht; public void setName(String pName){ name = pName; } public String getName(){ return(name); } public void printAllAttributes(){ System.out.println("Name = "+name); System.out.println("Gewicht = "+gewicht); } // Konstruktoren und Methoden wie früher... Es gibt keine Mischung aus der Verarbeitung von Daten und Eingaben bzw. Ausgaben.

public class Maintest1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setGewicht(123); myh1.printAllAttributes(); } Wie wird der Wert aller Attribute auf dem Bildschirm ausgegeben? Was wird durch diese Anweisung auf dem Bildschirm ausgegeben? Name = Musterhund Gewicht = 123

Weitere WICHTIGE BEMERKUNGEN:

Wird ein Attribut nicht im Konstruktor vorbelegt (sondern bei der Deklaration), dann verändert der Compiler eigenmächtig den Quellcode des Konstruktors !!

Beispiel:

private double gewicht=10; public Hund(String pName, double pGewicht){ class Hund{ private String name; private double gewicht=10; public Hund(String pName, double pGewicht){ name=pName; gewicht=pGewicht; } // weitere Methoden wie früher } Bei der Deklaration wird das Attribut mit 10 vorbelegt. Was macht der Compiler damit? gewicht=10 Eigenmächtig wandelt der Compiler den Quellcode des Konstruktors so um ... daß er in die 1. Zeile die Zuweisung (Initialisierung) einfügt