Subklassentyp oder Superklassentyp?

mlnw11

Neues Mitglied
Hallo zusammen,
angenommen ich habe eine Klasse Tier und einer Klasse Katze extends Tier. In der Klasse Tier gibt es nur einen Konstruktor und in der Klasse Katze neben einem Konstruktor noch die Methode miau(). Wenn ich folgenden Code aufrufe, gibt es einen Fehler:

Tier t1 = new Katze();
t1.miau();

Es heißt, dass Tier über keine Methode miau() verfügt. Das stimmt. Aber t1 habe ich doch mit new Katze() als Instanz vom Typ Katze bestimmt, dann müsste t1 doch eine Katze sein und somit auch über die Methode miau() verfügen, oder? Kann ich also immer nur auf Methoden, die nur die Subklasse hat, aber nicht die Superklasse, zugreifen, wenn das Objekt mit Subklasse objekt = new Subklasse(); erzeugt wurde und nie mit Superklasse objekt = new SUbklasse();? Ist das mit Variablen dasselbe? VIELEN DANK!
 
K

kneitzel

Gast
Du rufst die Methode miah auf eine Variable Tier auf. Was da für eine Instanz drin ist, kann der Compiler aber doch nicht wissen. Da kannst Du eine Katze rein packen oder eben irgend etwas anderes, das von Tier erbt. Daher kannst Du auf der Variablen vom Typ Tier nur Methoden vom Typ Tier zugreifen.

Und das ist halt das Mittel der Abstraktion bei der Objektorientierten Entwicklung. Du willst etwas mit einem Tier machen. Daher hast Du eine Variable vom Typ Tier. Was da für ein Tier dann drin steckt, ist dir egal - denn für das was Du machen willst, dazu brauchst du nur ein Tier!
Der Vorteil ist, dass Du die Katze halt mit beliebigen anderen Tieren ersetzen kannst.

Du musst Dir also genau überlegen, was Du wirklich machen willst und was Du dann brauchst. Und entsprechend die Typen wählen.
 

mlnw11

Neues Mitglied
Du rufst die Methode miah auf eine Variable Tier auf. Was da für eine Instanz drin ist, kann der Compiler aber doch nicht wissen. Da kannst Du eine Katze rein packen oder eben irgend etwas anderes, das von Tier erbt. Daher kannst Du auf der Variablen vom Typ Tier nur Methoden vom Typ Tier zugreifen.

Und das ist halt das Mittel der Abstraktion bei der Objektorientierten Entwicklung. Du willst etwas mit einem Tier machen. Daher hast Du eine Variable vom Typ Tier. Was da für ein Tier dann drin steckt, ist dir egal - denn für das was Du machen willst, dazu brauchst du nur ein Tier!
Der Vorteil ist, dass Du die Katze halt mit beliebigen anderen Tieren ersetzen kannst.

Du musst Dir also genau überlegen, was Du wirklich machen willst und was Du dann brauchst. Und entsprechend die Typen wählen.
Danke. Das habe ich soweit verstanden. Wenn ich aber eine Variable Tier erstelle mit einer Instanz Katze und dann davon eine überschriebene Methode aufrufe, wird trotzdem nicht die Methode der Superklasse, sondern der Subklasse ausgeführt. Wie kann das sein?
 
K

kneitzel

Gast
Das nennt sich Polymorphie und dient in der objektorientierten Entwicklung dazu, einer abgeleiteten Klasse ein spezialisiertes Verhalten zu geben.

Das ist dann auch als "late binding" bekannt: Zur Compile-Zeit ist noch nicht bekannt, welche Methode aufgerufen wird.
 

Neue Themen


Oben