Frage von x123FRAGE456x, 33

informatik: Konstruktor?

die Klasse Person verfügt über die Konstruktoren Person(String haarfarbe) und Person(String name). Warum ist leider ein Fehler? Wenn es mehrere Konstruktoren in einer Klasse gibt: woher weiß der Compiler, welchen Konstruktor er nehmen muss? Warum ist es manchmal nicht möglich, alle Attribute direkt bei Erzeugung des Objekts zu belegen? Wie kann ich Attribute nachträglich ändern?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von martin0815100, 18

Das sind ja gleich drei Wünsche auf einmal, das gibts nur bei Kinderüberraschung.

Eine Klasse kann beliebig vielke Konstruktoren haben. Die unterscheiden sich aber in den Übergabeparametern.

Das ist ähnlich wie bei gleich benamten Methoden, die müssen sich auch in den Parametern unterscheiden. Das ganze nennt man auch Methoden- oder Konstruktorsignatur.

Der Java Interpreter (Compiler) entscheidet also durch die Parameter im Aufruf welcher Konstruktor genommen wird.

Bei der Parametersignatur geht es aber nur um die Datentypen. Zwei Konstruktoren mit jeweils einem String Parameter (egal welcher Name) machen keinen Sinn da sie nicht unterscheidbar sind. Der Name gibt ja lediglich den Ort an wo die übergebene Info abgelegt wird.

Beim Aufruf weiß der COmpiler also nur den Typ string und bei Deiner Definition ist das ein Fehler da die Konstruktoren nicht eindeutig sind.

Korrekt wäre es wenn man die Haarfarbe optional dazunimmt und den Namen immer fordert. Das wäre dann so:

Person (string name)
{
  ...
}

Person (string name, string haarfarbe)
{
  ...
}
// später könnte der Aufruf dann so sein:

Person p1 = new Person("Helmut");
Person p2 = new Person("Hubert", "grau");

// Attribut nachträglich ändern sofern es als public definiert ist:
p1.haarfarbe = "schwarz";
Kommentar von x123FRAGE456x ,

Warum ist es manchmal nicht möglich, alle Attribute direkt bei Erzeugung des Objekts zu belegen?

Kommentar von RakonDark ,

weil man manchmal halt die haarfarbe noch ncht kennt , aber die person schon brauch für sachen wo man die harfarbe halt noch nciht kennt .

z.b. eine registrierung ohne haarfarbe funktioniert dann trotzdem  und auch mit haarfarbe funktioniert sie , wenn man entsprechend 2 konstruktoren hat .

Kommentar von martin0815100 ,

Weil es kein C# ist ^^

In Java muss der Ersteller der Klasse es durch einen passenden Konstruktor so vorgesehen haben.

Wenn Du ein Framework wir Spring verwendest. Kannst Du ein Objekt in XML konfigurieren. Dabei kannst Du alle möglichen Werte festelegen, auch welche die nach der Objekterzeugung gesetzt werden müssten da es keinen Konstruktor gibt.

Mit den gewöhnlichen Java Mitteln kannst Du aber nur alles setzen was man so in einem Konstruktor mitgeben kann.

Wenn das Objekt mal da ist, dann setzt du halt danach die Properties.

Kommentar von RakonDark ,

es gebe noch neben dem überladen , das überschreiben des jeweiligen konstruktors , bei gleichen paramtertypen wird dann das vorherige überschrieben .

Kommentar von x123FRAGE456x ,

ok

Antwort
von triopasi, 11

Naja, das Problem ist ganz einfach, dass die Datentypen der Parameter gleich sind, und das geht nicht.

Person(String name) und Person(Color haarfarbe) wäre hingegen möglich.

Der Compiler identifiziert die Funktionen anhand der Signatur, die (so weit ich glaube) den Funktionsnamen sowie die Datentypen berücksichtigt, jedoch nicht die Namen der Parameter.


public Attribute kannst du über instanzname.attributName ändern. Ansonsten musst du getter/setter implementieren,

Zu deinen anderen Frage Frag etwas konkreter bitte.

Antwort
von MatthiasHerz, 17

Um welche Sprache geht's?

Kommentar von x123FRAGE456x ,

java

Kommentar von MatthiasHerz ,

Da muss ich passen. Sorry.

Keine passende Antwort gefunden?

Fragen Sie die Community