Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- Logik (http://www.informatikerboard.de/board/board.php?boardid=16)
----- Vererbung Konstruktor (http://www.informatikerboard.de/board/thread.php?threadid=2091)


Geschrieben von Mike04 am 21.01.2015 um 19:32:

  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



Geschrieben von eulerscheZahl am 21.01.2015 um 19:38:

 

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;
	}
}



Geschrieben von Mike04 am 21.01.2015 um 19:41:

 

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

Dankeschön ;-)



Geschrieben von Karlito am 21.01.2015 um 19:51:

 

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



Geschrieben von Mike04 am 21.01.2015 um 19:56:

 

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?



Geschrieben von Karlito am 21.01.2015 um 20:09:

 

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



Geschrieben von Mike04 am 21.01.2015 um 20:17:

 

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


Forensoftware: Burning Board, entwickelt von WoltLab GmbH