Posti Geschrieben 24. Januar 2010 Geschrieben 24. Januar 2010 Hallo, ich bin gerade dabei etwas für eine Java Arbeit zu lernen. Hab mich jetzt grad etwas mit Polymorphie beschäftigt. Dazu habe ich selber ein paar Klassen geschrieben. Leider gibs dabei noch ein Problem. Ich hab 2 Klasse erstellt. Eine Klasse nennt sich Angestellter. Die andere nennt sich Abteilungsleiter. In der Klasse Angestellter gibt es die Attribute name, alter, und gehalt. In der Klasse Abteilungsleiter gibt es zusätzlich noch das Attribut abteilung. Die Klasse Abteilungsleiter erbt von der Klasse Angestellter. Ich habe in beiden Klassen die Methode showDaten implementiert. Die soll in der Klasse Angestellter alle Attribute ausgeben also alter, name und gehalt. In der Klasse Abteilungsleiter soll zusätzlich noch die abteilung mit ausgegeben werden. Über meine Klasse Firma erstelle ich jetzt 2 Objekte. Angestellter a1=new Angestellter(); Angestellter a1=new Abteilungsleiter(); Beim Compilieren wird mir gesagt das er die Methode setAbteilung nicht finden kann. Der Compiler sucht anscheinend aber auch in der Klasse Angestellter und nicht in der Klasse Abteilungsleiter. Wenn ich die Objekte so erzeuge funktionert es: Angestellter a1; a1=new Angestellter(); Abteilungsleiter a2; a2=new Abteilungsleiter(); public class Angestellter { public String name; public String gehalt; public String alter; public void setName(String name) { this.name=name; } public String getName() { return name; } public void setGehalt(String gehalt) { this.gehalt=gehalt; } public String getGehalt() { return gehalt; } public void setAlter(String alter) { this.alter=alter; } public String getAlter() { return alter; } public void showDaten() { System.out.println("Angestellter"); System.out.println(name); System.out.println(gehalt); System.out.println(alter); } } public class Abteilungsleiter extends Angestellter { public String abteilung; public void setAbteilung(String abteilung) { this.abteilung=abteilung; } public String getAbteilung() { return abteilung; } public void showDaten() { System.out.println("Abteilungsleiter"); System.out.println(name); System.out.println(gehalt); System.out.println(alter); System.out.println(abteilung); } } public class Firma { public static void main (String argv[]) { Angestellter a1; a1=new Angestellter(); Angestellter a2; a2=new Abteilungsleiter(); a1.setName("Harald"); a1.setGehalt("1500"); a1.setAlter("20"); a2.setName("Manni"); a2.setGehalt("3000"); a2.setAlter("40"); a2.setAbteilung("IuK"); a1.showDaten(); a2.showDaten(); } } Auf dieser Seite hier JAVA: 5.4 Polymorphie wird das ganze aber so beschrieben das man die Objekte so erstellen soll wie man es in meinem Code oben sieht. Also: Angestellter a1; a1=new Angestellter(); Angestellter a2; a2=new Abteilungsleiter(); Es funktioniert aber nur so; Angestellter a1; a1=new Angestellter(); Abteilungsleiter a2; a2=new Abteilungsleiter(); Was ist denn jetzt richtig oder besser gesagt wie wird es richtig gemacht? MfG Andreas Zitieren
lupo49 Geschrieben 24. Januar 2010 Geschrieben 24. Januar 2010 Angestellter a2; a2=new Abteilungsleiter() [...] a2.setAbteilung("IuK"); Das funktioniert nicht, weil du nur auf Methoden zugreifen kannst, die auch in der Klassen Angestellter definiert sind. Es wird sozusagen ein Filter angewendet, der alle Methoden/Attribute filtert, die in der Klasse Abteilungsleiter zusätzlich definiert sind. So bist du bspw. auch in der Lage unterschiedliche Objekte vom Typ Angestellter in die Referenz a2 zu speichern. Angestellter a1=new Angestellter(); Angestellter a2 = new Abteilungsleiter(); [...] a1 = a2; Das würde ja logischerweise nicht funktionieren, wenn a2 die Attribute "Abteilung" hätte. Was soll mit den Attributen bei Zuweisung in a1 geschehen? Wenn du auf die Methode zugreifen möchtest, musst du vorher eine Typumwandlung vornehmen: Abteilungsleiter abtl = (Abteilungsleiter)a2; abtl.setAbteilung("IuK"); Eine Überprüfung, ob ein bestimmtes Objekt vom Typ X ist, geht mit "instanceof". if(a2 instanceof Abteilungsleiter) { Abteilungsleiter abtl = (Abteilungsleiter)a2; abtl.setAbteilung("foo"); } Zitieren
Posti Geschrieben 24. Januar 2010 Autor Geschrieben 24. Januar 2010 Ok danke für die ausführliche Erklärung. Wenn ich das Objekt so erzeuge funktioniert es. Abteilungsleiter a2; a2=new Abteilungsleiter(); a2.setAbteilung("IuK"); Wird denn hierbei noch der "Sinn" von Polymorphie erfüllt? Die Homepage mit dem Beispiel irritiert mich. Dort wird jetzt etwas geschrieben was sich nicht compilieren lässt. Zitieren
lupo49 Geschrieben 24. Januar 2010 Geschrieben 24. Januar 2010 Wenn ich das Objekt so erzeuge funktioniert es. Ja, weil a2 auf eine Instanz vom Typ Abteilungsleiter referenziert. So etwas würde ja auch ohne Vererbung bzw. Polymorphismus funktionieren. Wird denn hierbei noch der "Sinn" von Polymorphie erfüllt? Bei dem von dir genannten Beispiel nicht. Die Homepage mit dem Beispiel irritiert mich. Dort wird jetzt etwas geschrieben was sich nicht compilieren lässt. Auf der Homepage wird die Methode lieferePersonalien() aufgerufen. Diese Methode ist in der Oberklasse als auch in der Unterklasse definiert (d.h. sie wird überschrieben!). Dadurch wird zur Laufzeit entschieden, ob die Methode aus der Unter- bzw. Oberklasse aufgerufen wird, abhängig vom Objekt. Das macht u.a. auch Polymorphismus aus, dass zur Laufzeit entschieden wird, welche Methode aufgerufen wird. Zitieren
Posti Geschrieben 24. Januar 2010 Autor Geschrieben 24. Januar 2010 Wie würde denn bei meinen Beispiel Polymorphie aussehen? geht das jetzt nur über diese Typumwandlung? Habe auch noch kein Beispiel gesehen in dem set und get Methoden benutzt werden. Meistens werden die Attribute über den Konstruktor zugewiesen. Zitieren
lupo49 Geschrieben 24. Januar 2010 Geschrieben 24. Januar 2010 Wie würde denn bei meinen Beispiel Polymorphie aussehen? geht das jetzt nur über diese Typumwandlung? Angestellter a1 = new Angestellter(); Angestellter a2 = new Abteilungsleiter(); a1.showDaten(); Hier würde dann zur Laufzeit entschieden, aus welcher Klasse die Methode "showDaten()" aufgerufen würde. Das macht jetzt an dem Beispiel nicht soviel Sinn. Besser wäre eine Vererbungshierachie like: Mitarbeiter | --------------------------------- | | | Angestellter Abteilungsleiter Geschäftsführer Wenn in jeder Klasse die Methode showDaten() existieren würde, dann würde hier ebenfalls zur Laufzeit entschieden, in welcher Klasse die Methode aufgerufen wird. Habe auch noch kein Beispiel gesehen in dem set und get Methoden benutzt werden. Meistens werden die Attribute über den Konstruktor zugewiesen. Du möchtest ja auch nach Erzeugung die Attribute ändern können (Bsp.: Der Abteilungsleiter bekommt eine neue Abteilung zugewiesen: a2.setAbteilung("foo"); ). Durch das Kapselungsprinzip bist du auf getter/setter-Methoden angewiesen. Zitieren
Posti Geschrieben 24. Januar 2010 Autor Geschrieben 24. Januar 2010 (bearbeitet) Ok danke für deine Antwort. Habe hier nochmal meinen Code geändert. Hier weise ich die Attribute über den Konstruktor zu. public class Angestellter { public String name; public String gehalt; public String alter; public Angestellter(String name, String gehalt, String alter) { this.name=name; this.gehalt=gehalt; this.alter=alter; } public void showDaten() { System.out.println("Angestellter"); System.out.println("Name: "+this.name); System.out.println("Gehalt: "+this.gehalt); System.out.println("Alter: "+this.alter); System.out.println(); } } public class Abteilungsleiter extends Angestellter { public String abteilung; public Abteilungsleiter(String name, String alter, String gehalt, String abteilung) { super(name, alter, gehalt); this.abteilung=abteilung; } public void showDaten() { System.out.println("Abteilungsleiter"); System.out.println("Name: "+name); System.out.println("Alter: "+alter); System.out.println("Gehalt: "+gehalt); System.out.println("Abteilung: "+abteilung); System.out.println(); } } public class Firma { public static void main (String argv[]) { Angestellter a1; a1=new Angestellter("Harald", "2000", "20"); Angestellter a2; a2=new Abteilungsleiter("Manni", "3000", "30", "IuK"); //Zeige Daten des Angestellten a1.showDaten(); //Zeige Daten des Abteilungsleiters a2.showDaten(); } } Habe die Attribute jetzt über den Konstruktor zugewiesen. Dieses Beispiel sollte doch jetzt den Sinn von Polymorphie erfüllen oder nicht? Ist es eigentlich möglich seinen letzten Beitrag zu ändern hier im Forum? wollte eigentlich nicht extra neu posten jetzt. Bearbeitet 24. Januar 2010 von Posti Zitieren
lupo49 Geschrieben 24. Januar 2010 Geschrieben 24. Januar 2010 Dieses Beispiel sollte doch jetzt den Sinn von Polymorphie erfüllen oder nicht? Ja. Durch die Überladung der Konstruktoren und dem Aufruf von showDaten(). Ist es eigentlich möglich seinen letzten Beitrag zu ändern hier im Forum? wollte eigentlich nicht extra neu posten jetzt. Innerhalb von 15 Minuten und wenn kein weiterer Beitrag erstellt wurde. Zitieren
Posti Geschrieben 24. Januar 2010 Autor Geschrieben 24. Januar 2010 Ok alles klar. Nochmal danke für die Antworten. Du hast mir die Polymorphie jetzt etwas verständlicher gemacht. Ich werd noch nen paar Übungsaufgaben machen. 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.