# Super Klasse Vererbung Problem :/



## Tayfun42 (14. Okt 2013)

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

```
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

```
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

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


----------



## JavaGott (14. Okt 2013)

Tayfun42 hat gesagt.:


> Ich bekomme immer eine Fehlermeldung



Welche?


----------



## Tayfun42 (14. Okt 2013)

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


----------



## geqoo (14. Okt 2013)

Der Eltern-Konstruktor erwartet nach dem:

```
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:


```
super(hersteller);
super(model);
```

Also das hier verwenden:


```
super (hersteller, model);
```


----------



## JavaGott (14. Okt 2013)

Ah ok, hätte mir aber auch auffallen können 

Dein Konstruktor der Fahrzeug Klasse sieht 2 werte als Übergabe vor

```
public Fahrzeug(String hersteller, String model){
```

bedeutet du brauchst das:

```
super(hersteller, modell);
```


----------



## Tayfun42 (14. Okt 2013)

Danke hat alles funktioniert 

Noch eine Frage, wir haben eine Aufgabenstellung bekommen da muss ich Polymorphismus und Late-Binding an 3 Beispielen zeigen. Was ist das? :/

Hier die Aufgabenstellung die wir dazu bekommen haben:
http://217.17.29.241/pluginfile.php/35774/mod_assign/intro/Aufgabenstellung_Autohandel.pdf


----------



## JavaGott (14. Okt 2013)

Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung
Late binding - Wikipedia, the free encyclopedia
Early BInding & Late BInding - Java Forum


----------



## Tayfun42 (15. Okt 2013)

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

```
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 

```
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

```
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

```
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


----------



## calousy (15. Okt 2013)

_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.:

```
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).


----------



## Tayfun42 (16. Okt 2013)

Hier ist nochmal die Aufgabenstellung hochgeladen als Anhang.

Jetzt habe ich in meine Anwendung den Code,


```
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:


----------



## calousy (16. Okt 2013)

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

```
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.

```
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");
}
```


----------

