Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Logik » Vererbung Konstruktor » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Vererbung Konstruktor
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Mike04
unregistriert
Vererbung Konstruktor Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hey, hier bin ich noch einmal :-)

Bin gerade beim Thema Vererbung und wollte gerade eine Klasse ableiten. Jetzt bekomme ich die Fehlermeldung "Implicit super constructor is undefined for default constructor. Must define an explicit constructor.

Muss denn in der vererbten Klasse der Konstruktor noch einmal neu definiert werden?

Wie macht man sowas?

Meine Ideen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

class Mensch 
{
	String name;
	
	private Mensch (String name) // Konstruktor 
	{
		this.name = name; 
	}

	public void getName(String name)  // Methode für private
	{
		this.name = name;
		System.out.println(name);
	}
}


class Soldat extends Mensch 
{
	Mensch mensch = new Mensch ();
	public void groesse (int cm)
	{
		System.out.println(cm);
	}
}




Vielen Dank
21.01.2015 19:32
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wenn du nicht selbst einen Konstruktor erstellst, wird ein Defaultkonstruktor angelegt. Dieser nimmt keine Argumente entgegen. Mensch hat aber keinen solchen Konstruktor. Daher musst du bei Soldat auch selbst einen Konstruktor schreiben.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
class Soldat extends Mensch 
{
	private int size;
	public Soldat(String name, int size) {
		super(name);
		this.size = size;
	}

	public int getSize() {
		return size;
	}
}


__________________
Syntax Highlighting fürs Board (Link)
21.01.2015 19:38 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Mike04
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Gut, dass du so schnell zur Stelle bist :-)

Dankeschön ;-)
21.01.2015 19:41
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Moin,

der Code wird so nicht funktionieren, da der Konstruktor in Mensch nicht zugreifbar ist. super(name) schlägt somit fehl. Der Konstruktor muss beispielsweise protected sein (anstatt private).

Private Konstruktoren verwendet man übrigens nur dann, wenn man ihn in einer statischen Methode verwendet. Es ist so nämlich nicht möglich new Mensch("Klaus"); aufzurufen. Eine bekannte verwendung von privaten Konstruktoren ist das Singleton-Pattern. Dieses stellt sicher, dass es von einer Klasse nur eine einzige Instanz gibt. Wenn man gar nicht will, dass Klassen instanziiert werden können, wird üblicherweise abstract genutzt und kein privater Konstruktor.

Gruß,

Karlito
21.01.2015 19:51 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Mike04
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für den Hinweis. Das habe ich auch gesehen und dann auf protected abgeändert.

Gibt es zwischen protected und private eigentlich einen großen Unterschied?
21.01.2015 19:56
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Offensichtlich ja (müsstest du doch gerade gemerkt haben), da mit private gekennzeichnete Methoden, Konstruktoren und Felder von außerhalb der Klasse nicht zugreifbar sind... Protected regelt die Zugreifbarkeit so, dass erbende Klassen zugreifen können. Dazu kommen noch public und default. Siehe hier.

Edit: es ist natürlich die Frage, was man als groß ansieht. Ich persönlich finde den Unterschied zwischen protected und default kleiner...

Gruß,

Karlito
21.01.2015 20:09 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Mike04
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich denk's mir auch gerade, dass die erste Frage bezüglich des Unterschieds sinnlos war. Sorry dafür Forum Kloppe

Dass durch das Keyword protected dann aber die erbende Klasse Zugriff auf die Methoden hat, wusste ich nicht und erklärt so einiges :-)

Danke Daumen hoch
21.01.2015 20:17
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Logik » Vererbung Konstruktor