Überschreiben von Methoden in Java und anschließendes Umwandeln des Objekts in das Verhalten der übergeordneten Klasse

7

Ich habe eine Elternklasse, A, und eine Kindklasse, B und B überschreibt eine Methode, f, von A.

%Vor%

Ich erstelle ein Objekt vom Typ B, b, und werfe dieses auf A und weise es einer Variablen vom Typ A, a zu und rufe dann die Methode f auf a auf. Nun würde ich erwarten, dass die Methode der Elternklasse aufgerufen wird, da ich mit einem Objekt vom Typ A arbeite, aber nicht, es ruft die b-Version der Methode auf (druckt "B" statt "A" in) der Code unten).

Warum ist es so? Ist es eine Designentscheidung oder eine Grenze der Technologie?

    
Þór Óðinsson 04.04.2014, 23:25
quelle

5 Antworten

13

Dies ist die Basis des Polymorphismus

Und es soll so funktionieren.

Jede Methode wird dynamisch (dynamisch) entsprechend dem tatsächlichen Typ des Objekts anstelle des Typs, auf den verwiesen wird, ausgelöst (ausgewählt / aufgerufen).

Wenn Sie das Objekt in einen anderen Typ umwandeln, verweisen Sie es einfach mit einem anderen Typ. Der tatsächliche Typ des Objekts wird nicht geändert. (Und es kann sich nie ändern).

Das Verhalten, das Sie beobachten, ist also wie erwartet und so gestaltet. Es ist definitiv keine Einschränkung.

Hoffe, das hilft.

    
Tanmay Patil 04.04.2014, 23:31
quelle
4

Es ist eine Designentscheidung. Sie haben ein Objekt vom Typ "B" erstellt, also ist es das, was es ist.

Wenn Sie es in A umwandeln, sagen Sie dem Interpreter nur, dass die Methoden, die in einer Klasse des Typs A erwartet werden, für B verfügbar sind, aber da Sie eine @Override-Methode für B haben, wird sie verwendet es.

    
Leo 04.04.2014 23:30
quelle
3
  

A a = (A) b;

Durch das Umwandeln der Variablen a hat sich die Referenz nicht geändert, so dass die Methode f immer noch aufgerufen wird, da Methodenaufrufe polymorph sind

    
Reimeus 04.04.2014 23:29
quelle
1

Wenn Sie die Instanz umwandeln, implizieren Sie einfach, dass es sich um eine Instanz der Superklasse handeln könnte, ABER die interne Implementierung dieser Instanz wird sich nicht ändern, deshalb erhalten Sie dieses Ergebnis!

Metaphorisch gesprochen, wenn Sie eine amerikanische Personenklappe auf eine britische Person (Besetzung) angewendet haben, wäre diese Person immer noch englisch (Vererbung), aber wenn Sie diese Person gebeten hätten zu sprechen (eine Methode aufzurufen), würden Sie immer noch die Briten hören Akzent, nicht der amerikanische (am Ende kommt es auf die interne Umsetzung an): -)

    
tf.alves 04.04.2014 23:28
quelle
1

So soll es funktionieren. Es ruft die Methode auf B auf, weil die Variable so instanziiert wurde. Der Typ der Variablen, der es zugewiesen wurde, ändert nicht die Tatsache, dass a vom Typ B ist. Die meisten Sprachen sind wie folgt, einschließlich C #.

    
AxiomaticNexus 04.04.2014 23:30
quelle

Tags und Links