Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
public class Fahrzeug
{
public static void main(String[] args)
{
Kombi OpelOmega = new Kombi();
OpelOmega.kofferraumGroesse = 4;
System.out.println("KofferraumGroesse: "+OpelOmega.kofferraumGroesse);
}
}
class Auto
{
public String typ;
public Auto(String typ) //Konstruktor
{
this.typ = typ;
}
}
class Kombi
extends Auto
{
public int kofferraumGroesse;
}
Ich erhalte dann folgende Fehlermeldung:
bash-2.05b$ javac Fahrzeug.java
Fahrzeug.java:24: cannot resolve symbol
symbol : constructor Auto ()
location: class Auto
class Kombi
^
1 error
Ist eigentlich auch klar da die Konstruktor Parameter keinen Wert zu gewiesen bekommen.
Meine Frage lautet also:
Wie Kann ich eine Klasse mit Konstruktor vererben?
Das Problem hierbei ist, daß die Oberklasse Auto einen parametrisierten Konstruktor enthält, deshalb wird kein parameterloser Konstruktor vom Compiler eingefügt. Um von Auto zu erben mußt du explizit den parametrisierten Konstruktor der Oberklase Auto, aufrufen.
Kann denn dann die Klasse Kombi auch noch eine parametisierten Konstruktor enthalten? oder nmúr inerhalb der Oberklasse? Oder muss müssen sich die Paramter von Ober- und Unterklasse unterscheiden?
also geht folgendes (würde es ausprobieren bin aber nicht zu Hause)??:
Code:
class Kombi
extends Auto
{
public String kombiTyp
public Kombi(String typ){
super(typ);
}
public Kombi(String kombiTyp)
{
this.kombiTyp = kombiTyp
}
public int kofferraumGroesse;
}
Jepp, das ist kein Problem, da du mit super einen Konstruktor der Oberklasse aufrufst.
Du mußt nur immer daruf achten, daß du in der Unterklasse expliziet mit super einen bestimmten Konstruktor der Oberklasse aufrufst.
super ist eine Referenz auf die Oberklasse. Genauso wie this eine Referenz auf die aktuelle Klasse ist. super kannst du daher nur in Methoden verwenden z.b.
Also bezieht sich immer auf Methoden und kann nur in einer klasse verwendet werden und nicht direkt in Verbindung mit einem Objekt.
Zwei Fragen hätte ich dann noch:
1) wie sieht das ganze bei mehrfachvererbung aus:
Code:
super.super.machWas()
2) bringt dies ganze Konstruktor vererbung überhaupt was? ist es nicht sinnvoller und wesentlich übersichtlicher passende Konstruktoren anzulegen. das sollte beim erzeugen eines Objekts für wesentlich weniger verwirrung im quelltext sorgen?
1) Es gibt keine Mehrfachvererbung in Java. Mit super kannst du immer nur eine Ebene nach oben gehen. Das heißt es gibt keinen Zugriff auf die Oberoberklasse.
2) Man kann Konstruktoren nicht vererben. this und super sind in Konstruktoren unerlässlich, denn damit kannst du genau bestimmen, welcher Konstruktor aufgerufen werden soll.
Habe es nun kapiert, hatte jetzt auch mal Zeit einige Dinge auszuprobiren. Etweder muss also der Superkonstruktor explezit oder wird implezit aufgerufen werden.
Expliziertes aufrufen ist immer dann nötig wenn der Superkonstruktor parameterisiert ist.
Also ist es äußerst sinnvoll auch immer einen parameterfreien Konstruktor in einer Klasse anzulegen(Der überhaupt nix macht) um zu verhinder das beim impleziten Aufruf super() kein Fehler entsteht!
Also ist es äußerst sinnvoll auch immer einen parameterfreien Konstruktor in einer Klasse anzulegen(Der überhaupt nix macht) um zu verhinder das beim impleziten Aufruf super() kein Fehler entsteht!