OOP Polymorphie

Angelika_25

Bekanntes Mitglied
Hallo Leute, ich habe hier ein Beispiel:
Java:
class A {
        A() {
                System.out.println("Konstruktor A");
        }
};

class B extends A {
        B() {
                 System.out.println("Konstruktor B");
        }
};

public static void main(String[] args) {
        B  b1 = new B();
        A a1 = new B();
}

Wie kann ich das verstehen?
a1 ist vom Typ A, also gibt das aus:
"Konstruktor A"

Aber B wird erzeugt..... häh??


Wie kann ich das verstehen?
 
Hallo,

Jedes Objekt, das von einer Oberklasse erbt ist auch vom Typ der Oberklasse.
Daher ist es möglich mit einer Referenz auf ein Objekt der Oberklasse ein Objekt der
Unterklasse anzulegen.

Man nennt dies deswegen Polymorphie, da zu Beginn noch nicht feststeht, ob die Referenz auf die Basisklass irgendwann mal auf ein Objekt der Basis oder auf ein Objekt der Unterklasse verweist.

Du kannst allerdings nur für A die Methoden nutzen, die auch in der Basis definiert wurden.

Stell die vor, Du hast eine Basisklasse Tier und davon erben Hund, Katze und Maus.
Mit einer Referenz auf Tier kannst Du nun Hunde, Katzen und Mäuse anlegen.

Der Vorteil ist, dass alle vom gleichen Basisklassetyp sind und Du alle gemeinsam in einem Array verwalten kannst.

Viel Spaß noch!

Gruß,
myjday
 
Also könnte ich nicht schreiben:
Java:
class A {
        A() {
                System.out.println("Konstruktor A");
        }
};
 
class B extends A {
        B() {
                 System.out.println("Konstruktor B");
        }
};
 
public static void main(String[] args) {
        B  b1 = new B();
        B c1 = new A();
}

Wie würde man den die main-Methode mit eigenen Worten ausdrücken?

Ich verstehe die Erklärung schon irgend wie, aber nicht ganz....

In dem vorhergehenden Beispiel erzeuge ich beispielsweise einen Hund, der ursprünglich von der Basisklasse Tier abstammt?
Wäre das so richtig?

Viele Grüße
 
nimm ein wenig aussagekräftigeres Beispiel:
Java:
interface Tree {
	void setColor();
}

interface FruitTree extends Tree {
	void getFruit();
}

abstract class AbstractTree implements Tree {
	@Override
	public void setColor() {
		System.out.println(this.getClass() + " COLOR");
	}
}

class Apple extends AbstractTree implements FruitTree {
	@Override
	public void getFruit() {
		System.out.println("mmmm....juicy apples");
	}
}

class ChristmasTree extends AbstractTree {// just a plain old tree...
}

class TreeTest {

	public static void main(String... _) {
		Tree[] trees = new Tree[] { new ChristmasTree(), new Apple(), new Apple() };
		for (Tree tree : trees) {
			// all we know: it is a Tree
			tree.setColor();
			if (tree instanceof FruitTree) {
				// now we know this tree has also fruits
				FruitTree ft = (FruitTree) tree;
				ft.getFruit();
			}
		}
	}
}

Alles sind Bäume. Alle Bäume kennen alles von Tree. Ein Früchtebeum kennt zusätzlich noch Früchte, aber er ist immer noch ein Baum.
 
Vllt schaust du dir mal diese Kapitel (Java ist auch eine Insel) an.

Java:
public class Tier
{
	private boolean isAlive	= false;
	
	public void born()
	{
		isAlive	= true;
	}
	
	public void die()
	{
		isAlive	= false;
	}
	
	public boolean getAlive()
	{
		return isAlive;
	}
	
	public void speak()
	{
		throw new RuntimeException("I am not able to speak");
	}
	
	public static void main(String[] args)
	{
		Tier hund	= new Hund();
		Tier unknown= new Tier();
		Object obj	= new Tier();
		
		hund.speak();
		unknown.speak();
		// obj.speak(); Object kennt die Methode speak nicht!
	}
}

class Hund extends Tier
{
	@Override
	public void speak()
	{
		System.out.println("Wuff!");
	}
}

Hier ein kleines Beispiel. Tier hat die Basisfunktionen: born,die und speak. i.d.R wird jedes Tier gebohren, jedes Tier wird sterben und iwie kann sich jedes Tier verständigen. In der Hund-Klasse überschreiben wir die speak-Methode, weil ein Hund andere geräusche macht als eine Katze oder ein Flo 😛.

Vererbung ist aber noch ein bisschen vielfältiger, deswegen solltest du dir den Artikel durchlesen.

MFG

Tomate_Salat
 
Hallo Angelika_25,

Deine Vermutung:
In dem vorhergehenden Beispiel erzeuge ich beispielsweise einen Hund, der ursprünglich von der Basisklasse Tier abstammt?
Wäre das so richtig?

Ja.

Du erzeugst eine Referenz auf ein mögliches Objekt der Klasse Tier. Das mögliche und auch angelegte Objekt ist aber kein Objekt der Basisklasse Tier sondern ein Objekt der Unterklasse Hund.

Solltest du das Buch Grundkurs Programmieren in Java Band 1 von Ratz/Scheffler/Seese/Wiesenberger zur Hand haben, dann schau mal auf Seite 305.

Es geht um einen Währungsrechner, der für jede Währung eine Klasse anlegt.
Stell dir vor, Du hast ein paar Dollar, ein paar Euro und noch irgendwo ein paar Yen.
Alle erben von der Oberklasse Währung.

Du willst wissen, wie viel Geld Du ausgedrückt in US$ besitzt. Jede Unterklasse besitzt die Methode
getUSDollar(), die den Wert der entsprechenden Währung in USDollar zurückliefert.

Deine ganzen Objekte, vom Typ Yen, vom Typ Euro und vom Typ USDollar legst du in ein Array vom Typ Währung (Umlaute natürlich ersetzen).

Um herauszufinden, wie viel Dein Vermögen in USDollar ist musst du nur Dein Array abfahren und von jedem Element die Methode getUSDollar() aufrufen, sämtliche Rückgabewerte aufaddieren und schon weisst Du wie reich Du bist.

Schönen Abend noch!

Gruß,
myjday
 

Zurück
Oben