HansChrisLuk Geschrieben 28. Januar 2007 Geschrieben 28. Januar 2007 Hallo, ich beschäftige mich gerade mit Polymorphie/Vererbung und habe dazu ein paar Fragen. Ich habe ein kleines Programm geschrieben und verstehe leider nicht alle Ausgaben: public class Vater { public int var=10; public void zeige() { System.out.println("Vater " + var); } } public class Sohn extends Vater{ public int var = 2; public int var2 = 22; public void zeige() { System.out.println("Sohn " + var + " " + var2); } public static void main (String[] args){ Vater vater_vater = new Vater(); Sohn sohn_sohn = new Sohn(); Vater vater_sohn = new Sohn(); ((Vater)vater_sohn).zeige2(); System.out.println(((Sohn)vater_sohn).var); System.out.println((vater_sohn).var); System.out.println(((Sohn)vater_sohn).var2); } Ausgabe: Sohn 2 22 2 10 22 Die 1. Ausgabezeile versteh ich nicht, ich dachte, ich habe vater_sohn zu Vater gecastet? Aber wieso nimmt er dann doch die Methode von Sohn? Wie kann ich das mit dynamischen und statischem Typ erklären? Ich würde ja gern mal schreiben, wie ich es mir bisher vorgestellt hatte, vielleicht stimmt es ja: Also in vater_sohn steht eine Referenz vom Typ Vater, auf ein Objekt vom Typ Sohn, ok, also kann vater_sohn alles, was auch Vater kann (sprich Methoden, welche aber überschrieben werden durch Sohn). Allerdings werden die Variablen nicht überschrieben, deshalb steht in dem Objekt, auf das vater_sohn zeigt der Wert für var=10 (die Methode wurde überschrieben)? Stimmt das so weit? Was passiert aber, wenn ich das jetzt caste? Also für Hilfe bin ich dankbar ! Zitieren
Dragon8 Geschrieben 28. Januar 2007 Geschrieben 28. Januar 2007 Ok, bei der vererbung, verhält sich das meiner meinung nach folgendermaßen. Attribute von Klassen werden überlagert, das heißt, wenn du dein objekt vater_sohn zum Typ vater castest, werden auch deren attribute aufgerufen, und beim casten zum typ sohn halt die attribute vom typ sohn. Methoden jedoch werden überschrieben, dies bedeutet, dass egal in welchen typ du dein objekt castest, immer die methode aufgerufen wird welche als letztes ne andere methode überschreibt. die einzige möglichkeit ne vorherige methode aufzurufen, ist mit super().[Methodenname], darüber kannst du wieder eine stufe höher gehen, aber mehr auch nicht. Zitieren
HansChrisLuk Geschrieben 30. Januar 2007 Autor Geschrieben 30. Januar 2007 aha! Ok, vielen Dank! Ich glaub, das kann ich mir merken! Gruß&Dank Chris Zitieren
mkScheller Geschrieben 31. Januar 2007 Geschrieben 31. Januar 2007 Nur n00ps hier, gruss an dich, alter!! Ist schon wahnsinn wo man sich überall trifft im netz! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.