Super Klasse Vererbung Problem :/

Tayfun42

Mitglied
Hallo,

wir behandeln gerade in der Schule die Vererbung mit Super extends usw. Jedoch habe ich paar Probleme, aber weiß nicht wo die liegen. Fahrzeug ist meine Oberklasse und PKW und LKW sind meine Unterklassen. Ich bekomme immer eine Fehlermeldung, könnte mir jemand da behilflich sein?;(


Fahrzeug Klasse
Java:
public class Fahrzeug{
  protected String hersteller;
  protected String model;
  
  public Fahrzeug(String hersteller, String model){
    this.hersteller = hersteller;
    this.model = model;
   } 
    
  
  public void setHersteller(String hersteller){
    this.hersteller = hersteller;
  }
  
  public void setModel(String model){
    this.model = model;
    }
    
  
  public String getHersteller(){
    return hersteller;
  }
  
  public String getModel(){
    return model;
    }
    
  
  public String toString(){
    return hersteller + model;
  }
  
}

LKW Klasse
Java:
public class LKW extends Fahrzeug{

  private String ladefläche;
  private String ps;
  
  public LKW (String hersteller, String model, String ladefläche, String ps){
    super(hersteller);
    super(model);
    this.ladefläche = ladefläche;
    this.ps = ps;
    }
  
  public void setLadefläche(String ladefläche){
    this.ladefläche = ladefläche;
  }
  
  public void setPs(String ps){
  this.ps = ps;
  }
  
  public String getLadefläche(){
  return ladefläche;
  }
  
  public String getPs(){
    return ps;
  }
  
  public String toString(){
    return ladefläche + " " + ps;
  }
  
 }

PKW Klasse
Java:
public class PKW extends Fahrzeug{
  
  private int sitzplatz;
  private double hochstgeschwindigkeit;
  
  public PKW (int sitzplatz, double hochstegeschwindigkeit){
    super(hersteller);
    super(model);
    this.sitzplatz = sitzplatz;
    this.hochstgeschwindigkeit = hochstegeschwindigkeit;
  }
  
  public void setSitzplatz(int sitzplatz){
  this.sitzplatz = sitzplatz;
  }
  
  public void setHochstgeschwindigkeit(double hochstgeschwindigkeit){
  this.hochstgeschwindigkeit = hochstegeschwindigkeit;
  }
  
  public int getSitzplatz(){
    return sitzplatz;
  }
  
  public double getHochstgeschwindigkeit(){
  return hochstgeschwindigkeit;
  }

  public String toString(){
  return hochstegeschwindigkeit + " " + sitzplatz;   
  }
}
 
Zuletzt bearbeitet:
Das ist die komplette Meldung die ich bekomme.


Compiliere C:\Users\Dinc\Desktop\Vererbung\LKW.java mit Java-Compiler
LKW.java:7:5: error: constructor Fahrzeug in class Fahrzeug cannot be applied to given types;
super(hersteller);
^
required: String,String
found: String
reason: actual and formal argument lists differ in length
LKW.java:8:10: error: call to super must be first statement in constructor
super(model);
^
2 errors

Compiliere C:\Users\Dinc\Desktop\Vererbung\Fahrzeug.java mit Java-Compiler
C:\Users\Dinc\Desktop\Vererbung\Fahrzeug.java erfolgreich compiliert!

Compiliere C:\Users\Dinc\Desktop\Vererbung\PKW.java mit Java-Compiler
PKW.java:7:11: error: cannot reference hersteller before supertype constructor has been called
super(hersteller);
^
PKW.java:7:5: error: constructor Fahrzeug in class Fahrzeug cannot be applied to given types;
super(hersteller);
^
required: String,String
found: String
reason: actual and formal argument lists differ in length
PKW.java:8:10: error: call to super must be first statement in constructor
super(model);
^
PKW.java:18:32: error: cannot find symbol
this.hochstgeschwindigkeit = hochstegeschwindigkeit;
^
symbol: variable hochstegeschwindigkeit
location: class PKW
4 errors
 
Zuletzt bearbeitet:
Der Eltern-Konstruktor erwartet nach dem:
Java:
public Fahrzeug(String hersteller, String model)
einen hersteller vom Typ String und ein model vom Typ String.

Du musst den Super-Konstruktor also auch so aufrufen, wie man ihn normalerweise aufruft: Mit den gleichen Argumenten - und nicht getrennt, so wie du es versuchst.

Statt diesen beiden Vögeln hier:

Java:
super(hersteller);
super(model);

Also das hier verwenden:

Java:
super (hersteller, model);
 
Zuletzt bearbeitet:
Ah ok, hätte mir aber auch auffallen können 🙂

Dein Konstruktor der Fahrzeug Klasse sieht 2 werte als Übergabe vor
Java:
public Fahrzeug(String hersteller, String model){

bedeutet du brauchst das:
Java:
super(hersteller, modell);
 
Also hab mein Programm fertig geschrieben, aber ich weiß nicht wie ich Polymorhpie und Lade-Binding an 3 Beispielen erklären soll :/

Anwendung
[Java]


public class Anwendung {

public static void main(String[] args) {

Fahrzeug f = new Fahrzeug("Audi","A8");
Fahrzeug f2 = new Fahrzeug("VW","Passat");
LKW l = new LKW("Mercedes","Actro","XXL",700);
LKW l2 = new LKW("Icevo", "Stralis", "XL",500);
PKW p = new PKW("BMW","530i",5,240.0);
PKW p2 = new PKW("Porsche","Panamera",5,260.0);
Nutzfahrzeug n = new Nutzfahrzeug("Massey Ferguson","135","Traktor",5.5);
Nutzfahrzeug n2 = new Nutzfahrzeug("John Deere", "T 560i", "Mähdrescher",7.2);

System.out.println(f.toString());
System.out.println("Fahrzeug: " + l.getHersteller()+ " Model: " + l.getModel() + l.toString());
System.out.println("Fahrzeug: " + p.getHersteller()+ " Model: " + p.getModel() + p.toString());
System.out.println("Fahrzeug: " + n.getHersteller()+ " Model: " + n.getModel() + n.toString());


} // end of main

} // end of class Anwendung

[/code]

Fahrzeug Oberklasse
Java:
public class Fahrzeug{
  protected String hersteller;
  protected String model;
  
  public Fahrzeug(String hersteller, String model){
    this.hersteller = hersteller;
    this.model = model;
   } 
    
  
  public void setHersteller(String hersteller){
    this.hersteller = hersteller;
  }
  
  public void setModel(String model){
    this.model = model;
    }
    
  
  public String getHersteller(){
    return hersteller;
  }
  
  public String getModel(){
    return model;
    }
    
  
  public String toString(){
    return "Hersteller: "+ hersteller + " Model: "+ model;
  }
  
}

LKW
Java:
public class LKW extends Fahrzeug{

  private String ladefläche;
  private int ps;
  
  public LKW (String hersteller, String model, String ladefläche, int ps){
    super(hersteller, model);
    this.ladefläche = ladefläche;
    this.ps = ps;
    }
  
  public void setLadefläche(String ladefläche){
    this.ladefläche = ladefläche;
  }
  
  public void setPs(int ps){
  this.ps = ps;
  }
  
  public String getLadefläche(){
  return ladefläche;
  }
  
  public int getPs(){
    return ps;
  }
  
  public String toString(){
    return " Ladefläche: " + ladefläche + " PS: " + ps;
  }
  
 }

PKW
Java:
public class PKW extends Fahrzeug{
  
  private int sitzplatz;
  private double hochstgeschwindigkeit;
  
  public PKW (String hersteller, String model, int sitzplatz, double hochstegeschwindigkeit){
    super(hersteller, model);
    this.sitzplatz = sitzplatz;
    this.hochstgeschwindigkeit = hochstegeschwindigkeit;
  }
  
  public void setSitzplatz(int sitzplatz){
    this.sitzplatz = sitzplatz;
  }
  
  public void setHochstgeschwindigkeit(double hochstgeschwindigkeit){
    this.hochstgeschwindigkeit = hochstgeschwindigkeit;
  }
  
  public int getSitzplatz(){
    return sitzplatz;
  }
  
  public double getHochstgeschwindigkeit(){
    return hochstgeschwindigkeit;
  }
  public String toString(){
    return " Sitzplatz: " + sitzplatz + " Hochstgeschwindigkeit: " + hochstgeschwindigkeit;
    
  }
}

Nutzfahrzeug
Java:
public class Nutzfahrzeug extends Fahrzeug{
  
  private String typ;
  private double gewicht;
  
  
  public Nutzfahrzeug(String hersteller, String model, String typ, double gewicht){
    super(hersteller, model);
    this.typ=typ;
    this.gewicht=gewicht;
  }
  
  public void setTyp(String typ){
    this.typ=typ;
    }
  public void setGewicht(double gewicht){
    this.gewicht = gewicht;
    }
    
   public String getTyp(){
    return typ;     
    }                 
   public double getGewicht(){  
    return gewicht;
  }  
  
  public String toString(){
    return " Typ: "+ typ + " Gewicht: "+ gewicht + " Tonnen";
  }
  
  }

Polymorphie wäre also das setzen der noch dazu gegeben Werte in die Objekte? Oder dass man durch die Polymorphie eine Vielfältigkeit hat?



Hier ist nochmal die Aufgabenstellung die ich dazu bekommen hatte:
http://217.17.29.241/pluginfile.php/35774/mod_assign/intro/Aufgabenstellung_Autohandel.pdf
 
Zuletzt bearbeitet:
Late Binding: Die richtige Funktion wird erst zur Laufzeit herausgefunden.
So wie du das hast, ist das deine toString() Methode. Allerdings musst du deinen Instanzen als Typen die Superklasse geben, um das zu zeigen. Also z.B. Fahrzeug f = new LKW();
Für Late Binding (auch als dynamische Bindung bekannt) musst du eine Methode in einer abgeleiteten Klasse überschreiben. Anderes Bsp.:
Java:
class Fahrzeug {
    public void start()
    {
        System.out.println("BrummBrumm");
    }
}
    
class Brummi extends Fahrzeug
{
    @Override
    public void start() {
        System.out.println("BRUUUUUUUMMMMMMMMM");
    }
}
Fahrzeug fahrzeug = new Brummi();
fahrzeug.start(); // BRUUUUUUUMMMMMMMMM
fahrzeug = new Fahrzeug();
fahrzeug.start(); // BrummBrumm

Deine Aufgabenstellung kann keiner sehen, da von hier vermutlich niemand einen Zugang außer du da hat (Link -> Weiterleitung auf https://217.17.29.241/login/index.php).
 
Zuletzt bearbeitet:
Hier ist nochmal die Aufgabenstellung hochgeladen als Anhang.

Jetzt habe ich in meine Anwendung den Code,

Java:
   Fahrzeug fa = new PKW("BMW","730",5,230.0);       
    
    System.out.println(fa.toString());

noch hinzugefügt. Wäre das also Late-Binding? Und wenn ich fa.toString() ausgebe.. gibt er mir nur Sitzplatz 5 und Hochstgeschwindigkeit 230.0 aus. Wieso wird Hersteller und Model nicht mit ausgegeben? :bahnhof:
 

Anhänge

ja, das ist dynamische Bindung. Wenn du bei PKW das toString-Methode rausnimmst, was kommt dann… das von der nächst höheren Klasse, in deinem Fall Fahrzeug.
Dass nur Sitzplatz und Höchstgeschwindigkeit ausgegeben wird ist eben Teil der Polymorphie 🙂
Schau dir mal deine Methode toString() in deiner Superklasse Fahrzeug an. Sie ist public, gibt einen String zurück und hat keine Parameter. Diese 3 Merkmale nennt man die Signatur der Methode toString.
Jetz gehst du her und leitest deine Klasse PKW von Fahrzeug ab. Gehen wir mal davon aus, dass du hier nicht die toString Methode implementierst. Du machst also
Java:
Fahrzeug f = new PKW();
f.toString();
Ausgabe: "Hersteller xy Model z"
nun implementierst du in deiner Klasse PKW exakt dieselbe Methode toString, mit exakt derselben Signatur, also "public String toString()". Du überschreibst damit die Methode der Superklasse - und damit eben alles was sie zurückgibt. In deinem Fall kann also nur Sitzplatz und Höchstgeschwindigkeit ausgegeben werden, da du ja alles andere überschreibst.
Wenn du jetzt trotzdem alles aus der Methode der Superklasse ausführen willst, kannst du das aber auch machen.
Java:
public String toString()
{
    String superString = super.toString(); // toString()-Methode der Superklasse "Fahrzeug" aufrufen und Ausgabe speichern
    System.out.println(superString); // Ausgeben
    System.out.println("hier die spezielle Ausgabe der Klasse PKW");
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben