Erste Schritte Konstruktoren verstehen

CodeOcean

Mitglied
Hi,

ich lerne aus einem Buch, in welchem ich die Grundlagen durch hab. Das nächste Kapitel bezieht sich auf die Objektorientierung - Das Buch heißt übrigens "Einführung in Java mit BlueJ".

Nun hab ich dieses Kapitel so gut wie durch, wobei ich noch bei einem Thema ein Verständnis-
Problem habe.

Das wären die Konstruktoren:

Java:
public class Kunde
{
    private boolean weiblich = false;  
    private String name = new String(); 
    private Konto girokonto = new Konto();

    public Kunde(String name, boolean weiblich)
    {
        this.name = name; 
        this.weiblich = weiblich;
    }
 
    public Kunde(boolean weiblich, String name)
    {
        this.name = name; 
        this.weiblich = weiblich;
    } 

  
    public void erhalteGeld(int betrag)
    {
        if(betrag <= 0)
        {
            System.out.println("Ich kann kein Geld sehen.");
        }
        else
        {
            girokonto.einzahlen(betrag);
        }
    } 
    //..... gekürzt

Jetzt habe ich auf meinem BlueJ, die Klassen Kunde und Konto. Anscheinend haben sie eine Verbindung zueinander, da sie mit Pfeilen verbunden sind. Die Verbindung von Kunde zu Konto, wird wohl der Konstruktor('private Konto girokonto = new Konto();') sein, nur weiss ich nicht, was genau die Verbindung auslöst bzw. was der Konstruktor da genau macht. Wie es auf das Erzeugen eines Objekts einwirkt. Ist es überhaupt nötig von der Klasse Kunde und Konto ein Objekt zu erzeugen, oder reicht es aus, dass das Kundenobjekt durch diesen Konstruktor auf eine Kontoklasse zugreift. Anders formuliert: Wird durch diesen Konstruktor, bei der Erzeugung eines Kundesobjekts, ein Kontoobjekt für jeden Kunden angelegt? Dann die Frage, wozu bei 'private Konto girokonto = new Konto();' dieses "girokonto" gedacht ist. Ist das die Variable, die jedes Kundenobjekt als Konto mitbekommt? Allgemein verstehe ich die Bauteile dieses Konstruktors nicht.

Das Buch ist wirklich verständlich Geschrieben, und auch bei schwierigen Themen kann man es nach ein paar mal Lesen gut verstehen. Ich hab das Große - und Ganze verstanden, nur dieses Bauteil fehlt, um ich den kompletten Code zu durchschauen.

Danke schonmal für's Lesen.

:)
 

sambalmueslie

Bekanntes Mitglied
Also ich versuche dir die Klasse mal in Worten zu erläutern.
Vielleicht findest du dann heraus was gemeint ist.

Also deine Bank hat viele viele Kunden. Der Typ 'Kunde' ist in der gleichnamigen Klasse definiert.
Jeder Kunde hat drei Eigenschaften.

  1. Das Geschlecht des Kunden
  2. Der Name des Kunden
  3. Das Konto des Kunden

Da ein Konto als Datentyp nicht existiert wird dieser in einer separaten Klasse definiert.
Dort sind die jeweiligen Eigenschaften des Kontos hinterlegt.

Die Klasse 'Kunde' hat aber nicht nur Eigenschaften (Variablen) sondern auch Funktionen oder Methoden. Sprich 'Dinge die der Kunde tun kann'. Da das Konto eine private Eigenschaft des Kunden ist, spricht man von "Kapselung". Jemand der das Objekt 'Kunde' verwendet, kann nicht direkt auf das Konto zugreifen. Er weiß nicht einmal, dass es das Konto dort gibt. Aber er weiß, was man mit dem Kunden alles so anstellen kann. (beispielsweise 'über den Tisch ziehen' oder 'erhalteGeld')

Da jeder Kunde durch ein entsprechendes Objekt repräsentiert wird, muss dieses Objekt erzeugt werden. Der Konstruktor übernimmt diesen Teil und initialisiert die Eigenschaften des Kunden.
Einen Teil der Eigenschaften muss man beim erzeugen des Kunden angeben. Beispielsweise das Geschlecht und den Namen. Andere Dinge werden einfach auf einen initialen Wert gesetzt.

In deinem Fall wird hier das Konto initialisiert und dort das Guthaben (im Interesse deiner Bank) natürlich auf 0€ gesetzt. Dafür ist aber der Konstruktor des Kontos zuständig.

Die Pfeile von denen du gesprochen hast, symbolisierten die Abhängigkeiten zwischen den beiden Klassen. Der Kunde hat ein Konto und ein Konto gehört zu einem Kunden. Ein Konto kann auch ohne Kunden nicht existieren. Zumindest sollte das so sein.

Versuch das mal in die Grafiken zu übertragen.

Gruß Oli
 

Gregorrr

Bekanntes Mitglied
Ein Konstruktor ist nichts anderes als eine Methode, die genau einmal bei Instantiierung des Objektes aufgerufen wird. Ich weiß nicht genau, worauf du mit "Bauteil" hinauswillst. Ein Konstruktor wurde so genannt, weil einfach oft ein Objekt auf gewisse Weise instantiiert wird. Ich denke mal einem Kunden ist ein Konto assoziiert. Also beim Anlegen eines Kunden muass auch zwingendermaßen eine Zuweisung eines Kontos erfolgen. Dies kann man durch Parameter im Konstruktor angeben, wobei dieser bei der Initialisierung als Argument angeben werden muss, bsp.
Code:
new Kunde(kontoXYZ)
. Damit wäre also bei der Instantiierung des Kundes eine Verknüpfung zu kontoXYZ gegeben...
 

CodeOcean

Mitglied
Hi Oli, erstmal Danke!

Ich hab es, glaub ich, verstanden:

Ich drück's mal so doof wie möglich aus...

Die Klasse Konto, ist nichts weiter als ein Datentyp mit dem Bezeichner girokonto. Also wie String(Datentyp) name(Bezeichner), auf den in der Klasse Kunde zugegriffen wird.

Was machen die "new Konto();" befehle?

Grüße
 

sambalmueslie

Bekanntes Mitglied
Jein :)

Eine Klasse ist mehr als 'nur' ein Datentyp. Eine Klasse besteht aus Eigenschaften und Funktionen.
Falls dir C/C++ was sagt, da gibt es Strukturen. Das sind Datentypen.

In Java könntest du einen neuen Datentypen durch das erzeugen einer Klasse mit nur öffentlichen Variablen und ohne Funktionen kreieren. (BÖSE!!!)

Mit der Klasse kannst du zusätzlich noch den Zugriff auf die Werte deines 'Datentypes' reglementieren.
Dafür gibt es die Funktionen. Einfaches Beispiel wäre im richtigen Leben ein Fernsehgerät.
Da gibt es ein paar Knöpfe und eine Fernbedienung und damit kannst du den Fernseher verwenden.

Wie jetzt die Signale über Kabel, Satellit oder sonst woher in den Fernseher kommen und dort so bearbeitet werden, dass die einzelnen Pixel mit der richtigen Farbe angesteuert werden. Davon hast du keine Ahnung. Brauchst du auch nicht, denn dafür gibt es ja Samsung, Sony usw.
Du musst nur wissen, wie du das Teil steuerst.

In Java ausgedrückt. Wäre das (stark vereinfacht) eine Klasse "Fernseher" mit vielen Eigenschaften z.b. den Pixeln. Da das Ansteuern der Pixel auch nicht so einfach ist, könnte man die Pixel in eine Klasse "Anzeige" auslagern. Der Fernseher hätte also eine Anzeige die das jeweilige Bild darstellt.

Du als Nutzer müsstest nur die Methode "zeige Programm(X)" aufrufen und alles andere macht der Fernseher. Schau mal im internetz unter dem Stichwort "Kapselung" nach.

Da wir es bei einer Programmiersprache mit etwas zu tun haben, das im Prinzip einfach nur Speicher manipuliert muss der Speicher auch entsprechend reserviert und organisiert werden. Dafür gibt es die Objekte. Das sind quasi die Realisierungen (Instanzen) einer Klasse. So wie du im MediaMarkt oder Saturn einen von 100 Fernsehern des selben Typs kaufen kannst so kannst du auch beim Programmieren für jeden deiner Kunden ein neues Objekt erzeugen und musst nicht jeden Kunden neu erfinden. Das Ergebnis ist, dass für jeden neuen Kunden in deinem Programm eine Instanz der Klasse "Kunde" erzeugt wird und diese im Speicher abgelegt wird. Das tut man mit dem Kommando (Schlüsselwort) "new". Jedes mal wenn "new" aufgerufen wird, wird eine neue Instanz der Klasse (also hier Konto) erzeugt. Denn schließlich möchte in deiner Bank jeder Kunde sein eigenes Konto haben und nicht alle sich ein gemeinsames Konto teilen.

Es passieren also zwei Dinge beim erzeugen eines neuen Kunden.
Zunächst wird die Klasse Kunde instantiiert (Kunde neuerKunde = new Kunde(....))
Das führt dazu, dass das Objekt erzeugt (Speicher belegt) und der passende Konstruktor von Kunde aufgerufen wird. Im Konstruktor von Kunde wird ein Objekt der Klasse "Konto" erzeugt. Nämlich das Konto Y für den Kunden X. Das machst du mit (Konto girokonot = new Konto(...))
Und damit kannst du dann den Kunden verwenden.
 

CodeOcean

Mitglied
Guten Morgen!

Ok, ich hab es verstanden. Die Klasse Konto, ist ein komplexer Datentyp(also wie du schon sagtest, ein Datentyp mit Funktionen). Ich hab jetzt noch etwas über den Heap gelesen. Das macht mir das Verstehen einfacher. Die Klasse Konto, ist sozusagen, genau wie die Klasse Kunde, eine "Standartklasse". Jedes Objekt der Klasse Kunde, bekommt durch den Konstruktor, ein eigenes Konto das auf dem Heap liegt. Dieser Heap war eben nicht sichtbar, was es mir schwer gemacht hat den Vorgang zu verstehen. Der Ausdruck "new Konto();" räumt auf dem Heap Speicher frei, in dem das Konto sein wird.

Das mit den Fernsehern ist gut.

"public class Fernseher

private Pixelanzeige anzeige = new Pixelanzeige();
private Stromverteiler verteiler = new Stromverteiler();
u.s.w..."

Vielen Dank! :D
 
Zuletzt bearbeitet:

sambalmueslie

Bekanntes Mitglied
Joa so ungefähr kannst es sehen.

Ich würde eher einen vom konkreten Speicher losgelösten Vergleich bemühen.

Stell dir vor du möchtest ein Buch drucken (so wie der gute alte Gutenberg)
Also erzeugst du zunächst einmal eine Matrize (so heißt das glaub) wo du die einzelnen Buchstaben einsetzen tust. Dann pinselst du das Teil mit Druckerschwärze ein und fängst an deine Seiten damit zu bedrucken indem du die Matrize auf das Papier presst. Erst dann hast du wirkliche Kopien des Originals.

In Software gesprochen entspricht die Klasse der Matrize. Sie ist nur eine Form und nichts weiter.
Beim instantiieren wird von der Klasse ein Objekt erzeugt. Das entspricht dem anpressen auf das Papier. Jetzt hast du eine Kopie deiner Information mit der du arbeiten kannst. Nämlich das jeweilige Objekt.
Jedes Objekt hat jetzt sein eigenes Leben und sie beeinflussen sich gegenseitig nicht. (Außer die Klasse definiert das explizit)

Wenn du beim Drucken das erste Exemplar mit Kaffee bekleckerst, das zweite zerknüllst und das dritte deinem Nachbarn schenkst, beeinflusst das nicht das Leben des vierten, fünften und aller weiteren Exemplare. Genauso ist es mit den Objekten. Du kannst das erste wegwerfen, das zweite manipulieren und das dritte bleibt immer noch wie es ist.

Das passiert dann eben im Speicher, weil Computer nun mal so ticken :) das ist dir als Hochsprachler aber eigentlich erst mal ziemlich wumpe ;) weil darum müssen sich der Compiler und das OS kümmern.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
J Konstruktoren und Grafik Java Basics - Anfänger-Themen 3
A Cannot find symbol mit Konstruktoren Java Basics - Anfänger-Themen 27
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
C Objekte und Konstruktoren Java Basics - Anfänger-Themen 2
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
M Vererbung Konstruktoren mit festen Werte Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Konstruktoren in Initialisierungsblöcke Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 25
D was bedeutet this. bei Konstruktoren? Java Basics - Anfänger-Themen 4
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
C Die Klasse Menge mit Konstruktoren und einfachen Methoden Java Basics - Anfänger-Themen 5
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10
G Was ist der Nutzen von generischen Konstruktoren? Java Basics - Anfänger-Themen 4
Q Methoden Konstruktoren anlegen Java Basics - Anfänger-Themen 5
B Objekte in Konstruktoren übergeben Java Basics - Anfänger-Themen 5
D Zähler nicht sichtbar (Thema: Konstruktoren) Java Basics - Anfänger-Themen 2
A Überladen von Konstruktoren Java Basics - Anfänger-Themen 2
V Konstruktoren Java Basics - Anfänger-Themen 15
C Klassen StackOverflow bei erster Nutzung von Klassen/Konstruktoren Java Basics - Anfänger-Themen 9
F Konstruktoren Java Basics - Anfänger-Themen 4
M Erste Schritte Verständnis Problem Konstruktoren Java Basics - Anfänger-Themen 13
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
B Klassen Unterschied Konstruktoren. Java Basics - Anfänger-Themen 3
W OOP Konstruktoren Erklärung Java Basics - Anfänger-Themen 14
N Abarbeitungsreihenfolge von Konstruktoren Java Basics - Anfänger-Themen 12
O Klassen und Konstruktoren Java Basics - Anfänger-Themen 7
V Konstruktoren -> Funktionsaufrufe Java Basics - Anfänger-Themen 7
Q Konstruktoren und Methoden Java Basics - Anfänger-Themen 2
C Konstruktoren Java Basics - Anfänger-Themen 7
J Konstruktoren Java Basics - Anfänger-Themen 10
M Konstruktoren & Veerbung Java Basics - Anfänger-Themen 6
T Konstruktoren Java Basics - Anfänger-Themen 6
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
R Vererbung Konstruktoren nicht erkannt Java Basics - Anfänger-Themen 17
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
J OOP Konstruktoren, setMethode, getMethode usw. Java Basics - Anfänger-Themen 7
A überladene Konstruktoren Java Basics - Anfänger-Themen 7
L Frage zu Konstruktoren und dem this Operator Java Basics - Anfänger-Themen 16
W 2 Konstruktoren Java Basics - Anfänger-Themen 8
B Vererbung und Konstruktoren Java Basics - Anfänger-Themen 33
N Vererbung von Konstruktoren mit Parametern Java Basics - Anfänger-Themen 7
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
A Konstruktoren sollen sich gegenseitig aufrufen Java Basics - Anfänger-Themen 10
B Konstruktoren Sichtbarkeit Java Basics - Anfänger-Themen 2
K Kann man Private-Konstruktoren doch aurufen? Java Basics - Anfänger-Themen 8
E Konstruktoren und Methoden Java Basics - Anfänger-Themen 10
E OOP individual + standard-Konstruktoren Java Basics - Anfänger-Themen 9
S Konstruktoren? Java Basics - Anfänger-Themen 5
K Konstruktoren Java Basics - Anfänger-Themen 13
H Konstruktoren – super! Java Basics - Anfänger-Themen 3
L Geschachtelte Konstruktoren Java Basics - Anfänger-Themen 4
hdi Kleine Design/Convention Frage zu Konstruktoren Java Basics - Anfänger-Themen 4
J Vererbung und Konstruktoren Java Basics - Anfänger-Themen 14
J Problem mit Konstruktoren Java Basics - Anfänger-Themen 2
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
H Befehl mit Konstruktoren Java Basics - Anfänger-Themen 2
L Konstruktoren bei Vererbung Java Basics - Anfänger-Themen 13
Z wie kann ich überladene Konstruktoren "umleiten"? Java Basics - Anfänger-Themen 11
D Blöde(?) Frage zu Konstruktoren und set-Methoden Java Basics - Anfänger-Themen 3
G Interface und Konstruktoren Java Basics - Anfänger-Themen 3
G Frage zu Konstruktoren Java Basics - Anfänger-Themen 12
G Verständnisfrage zu Konstruktoren Java Basics - Anfänger-Themen 5
G Konstruktoren Java Basics - Anfänger-Themen 9
A Konstruktoren überladen Java Basics - Anfänger-Themen 9
H Konstruktoren + Hilfe Java Basics - Anfänger-Themen 12
H Konstruktoren werden nie geerbt Java Basics - Anfänger-Themen 3
O Vor-/Nachteile/Unterschiede von Konstruktoren und Methoden Java Basics - Anfänger-Themen 3
Bierhumpen 2 Konstruktoren Java Basics - Anfänger-Themen 15
T mehrere Konstruktoren für eine Klasse Java Basics - Anfänger-Themen 7
J Instantvariablen und Konstruktoren Java Basics - Anfänger-Themen 2
Y Vererben - Konstruktoren Java Basics - Anfänger-Themen 2
Z übergabe von string[] an konstruktoren oder methoden Java Basics - Anfänger-Themen 3
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
S Frage zu Konstruktoren Java Basics - Anfänger-Themen 7
G Problem mit Gültigkeit von Variabeln und Konstruktoren Java Basics - Anfänger-Themen 4
C Konstruktoren Java Basics - Anfänger-Themen 4
G Konstruktoren (was, wozu, wieso, warum) Java Basics - Anfänger-Themen 4
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
B Deadlock verstehen der Ausgabe! Java Basics - Anfänger-Themen 12
jamboy7 Java-API kennenlernen, verstehen und nutzen lernen Java Basics - Anfänger-Themen 4
B Methodendeklaration verstehen Java Basics - Anfänger-Themen 2
J Methode verstehen Java Basics - Anfänger-Themen 3
S Allgemeine Java Codes lesen und verstehen Java Basics - Anfänger-Themen 7
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
J Hilfe beim verstehen Java Basics - Anfänger-Themen 3
S Anweisungen verstehen System.out.print/println Java Basics - Anfänger-Themen 2
B Webhooks verstehen - Beispiel? Java Basics - Anfänger-Themen 25
H Variable.methode aufstellen, verstehen Java Basics - Anfänger-Themen 2
B Interpreter-Fehler Code verstehen und Compilerfehler Java Basics - Anfänger-Themen 2
O Programm verstehen :D Java Basics - Anfänger-Themen 4
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
B Rekursion verstehen Java Basics - Anfänger-Themen 4
D Erste Schritte Code verstehen - HashSet Java Basics - Anfänger-Themen 8
E Rekursion verstehen. Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben