Vererbung Konstruktor

Neue Frage »

Auf diesen Beitrag antworten »
Mike04 Vererbung Konstruktor

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
 
Auf diesen Beitrag antworten »
eulerscheZahl

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;
	}
}
Auf diesen Beitrag antworten »
Mike04

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

Dankeschön ;-)
Auf diesen Beitrag antworten »
Karlito

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
 
Auf diesen Beitrag antworten »
Mike04

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?
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
Mike04

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
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »