Überschreiben und Überladen

baker333

Bekanntes Mitglied
Servus,

könnte mir jemand bitte erklären, warum im unteren Code bei "fahrzeug1.fahre(kind, erwachsener)" die Ausgabe "Person und Erwachsener in Auto" erscheint. Es gibt doch in der Klasse Auto die passende Methode fahre(Kind kind, Erwachsener erwachsener).

Danke

Java:
class Person {}
class Erwachsener extends Person {}
class Kind extends Person {}
class Fahrzeug {
 public void fahre(Person person, Person person2) {
 System.out.println("Person und Person in Fahrzeug");
 }
 public void fahre(Person person, Erwachsener erwachsener) {
 System.out.println("Person und Erwachsener in Fahrzeug");
 }
}
class Auto extends Fahrzeug {
 public void fahre(Person person, Erwachsener erwachsener) {
 System.out.println("Person und Erwachsener in Auto");
 }
 public void fahre(Kind Kind, Erwachsener erwachsener) {
 System.out.println("Kind und Erwachsener in Auto");
 }
}
class Boot extends Fahrzeug {
 public void fahre(Person person, Erwachsener erwachsener) {
 System.out.println("Person und Erwachsener in Boot");
 }
 public void fahre(Kind Kind, Erwachsener erwachsener) {
 System.out.println("Kind und Erwachsener in Boot");
 }
}
class Gummiboot extends Boot {
 public void fahre(Person person, Erwachsener erwachsener) {
 System.out.println("Person und Erwachsener in Gummiboot");
 }
}
public class Main {
 public static void main(String[] args) {
 Person person = new Person();
 Erwachsener erwachsener = new Erwachsener();
 Kind kind = new Kind();

 Fahrzeug fahrzeug1 = new Auto();
 Fahrzeug fahrzeug2 = new Gummiboot();
 Boot boot = new Gummiboot();

 fahrzeug1.fahre(kind, erwachsener);
 fahrzeug1.fahre(person, erwachsener);
 fahrzeug2.fahre(kind, kind);
 boot.fahre(erwachsener, erwachsener);
 boot.fahre(kind, erwachsener);
 }
}
 
könnte mir jemand bitte erklären, warum im unteren Code bei "fahrzeug1.fahre(kind, erwachsener)" die Ausgabe "Person und Erwachsener in Auto" erscheint. Es gibt doch in der Klasse Auto die passende Methode fahre(Kind kind, Erwachsener erwachsener).
Salopp formuliert: Du deklarierst fahrzeug1 vom Typ Fahrzeug. Daher stehen auch nur die Methoden aus Fahrzeug zur Verfügung. Wenn Du mit Kind (extends Person) und Erwachsener aufrufst, wird die Methode Fahrzeug#(Person, Erwachsener) verwendet. Diese wird in Auto überschrieben.
 
Wobei mir gerade nicht ganz klar ist: Wenn ich ein Fahrzeug deklariere, wieso kann er dann eine Methode in Auto überschreiben, wenn ich eigentlich ein Fahrzeug habe. Warum erhalte ich nicht "Person und Erwachsener in Fahrzeug"?
 
Trotzdem frage ich mich noch:
Wenn ich ein Fahrzeug deklariere, wieso kann er dann eine Methode in Auto überschreiben, wenn ich eigentlich ein Fahrzeug habe.

Ich glaube, dass mir :

Fahrzeug fahrzeug1 = new Auto(); noch nicht so richtig vorstellen kann. Einerseits ist jedes Auto ein Fahrzeug, deswegen kann ich ein Auto als Fahrzeug definieren, andererseits habe ich ja trotzdem ein Fahrzeug. Warum kann meine Methode "fahre" der Klasse Fahrzeug von der Methode "fahre" der Klasse Auto überschrieben werden?
 

Zurück
Oben