2017-04-18 3 views
-1

In dynamische Methode Bindung eine Superklassenreferenz kann nur eine Unterklasse Methode aufrufen, die geerbt und von ihr überschrieben wird. Das andere kann jedoch implementiert werden.Ist es möglich, dass ein Superklassenobjekt eine Unterklassen-Member-Methode referenziert, die nicht vererbt wird?

abstract class in 
{ 
    abstract void print(); 
} 
class a extends in 
{ 
    String name=this.getClass().getSimpleName(); 
    void show() 
    { 
     System.out.println("class "+name); 
    } 
    void print() 
    { 
     show(); 
    } 
} 
class Main 
{ 
    public static void main(String args[]) 
    { 
     in x; 
     x = new a(); 
     x.print(); 
    } 
} 

Hier druckt erfolgreich

Klasse ein

Auch getClass() die Unterklasse Namen der übergeordneten Klasse Objekt dieses bezieht sich anstelle von Super Namen als kehrt in Hauptmethode.

+3

Eltern können nicht über Kinder wissen. Ein Entwickler einer Klasse kann nicht wissen, wie seine Klasse von Benutzern erweitert wird. – duffymo

+0

Alle 'in' wissen, dass es eine Methode namens' print() 'haben soll. Die gesamte Implementierung dieser Methode findet innerhalb von 'a' statt, die alles über 'a' weiß (was den Klassennamen und andere Methoden betrifft). – khelwood

+0

Also meinst du x.print() ist äquivalent zu neuem a() .print()? Aber ist nicht x eine Superklassenreferenz? – ZEU5

Antwort

0

Ein übergeordneter Objektreferenz wird nur durch die Methoden eingeschränkt, die es in seiner Klassendefinition hat. Wenn diese Methoden von Unterklassen überschrieben werden und zur Laufzeit das tatsächliche Objekt, auf das die übergeordnete Referenz verweist, vom Unterklasse-Typ ist, wird diese überschriebene Methode aufgerufen. Es spielt keine Rolle, ob die überschriebene Methode Methoden aufruft, die ursprünglich nicht in der übergeordneten Klasse vorhanden sind, oder auf die Variablen zugreift, die nicht in der übergeordneten Klasse vorhanden sind.

Hier geht es um Polymorphie. Es ist beabsichtigt, dies so zu sein, da es die Programmerweiterung vereinfacht, falls wir unterschiedliche spezifische Vererbungshierarchien haben, bei denen die Elternklasse die genaue Implementierung bestimmter Methoden nicht kennen und die Dinge von den Unterklassen als eine Art Vertrag implementiert werden kann .

+0

Danke das war die einzige hilfreiche Antwort. :-) – ZEU5

0

Zukunft ist unbekannt Ein Entwickler eine Klasse A.java heute schreiben können in Zukunft die Namen oder Signaturen der Methoden nie vorhersagen, die andere Entwickler in seiner Klasse A.java erstreckt umfassen kann. Auch solche Klassen können zahlreich sein, wobei jedes getrennte Verfahren aufweist.

Basisklasse sollte niemals mit ihren Unterklassen gekoppelt werden. Es muss sich nicht darum kümmern, wie die Unterklassen implementiert werden.

Obwohl es nicht empfohlen wird, aber immer noch, wenn Sie die in einer der Unterklasse definierten Methode aufrufen möchten, können Sie es durch typecasting wie unten tun.

public class Parent { 
    public class someMethod(){ 
      if(this instanceof Child1){ 
       ((Child1)this).someAdditionalMethod(); 
      } 
    } 
} 

public class Child1 extends Parent{ 
    public class someAdditionalMethod(){ 

    } 
} 
Verwandte Themen