Zum Inhalt springen

Problem mit Polymorphie


Posti

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

}      

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Posti
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...