2012-04-12 6 views
-2

So habe ich ein Problem, das so etwas wie folgt aussieht:Java geordnete Klasse Instanziierung Aufruf Unterklasse Methode, nicht sicher, warum

package com.blah.A_package; 

public class A 
{ 
    public void f() { 
     g(); 
    } 

    protected void g() { 
     System.out.println("superclass g()"); 
    } 
} 

package com.blah.B_package; 

public class B extends com.blah.A_package.A 
{ 
    protected void g() { 
     System.out.println("subclass g()"); 
    } 
} 

public static void main(String[] args) 
{ 
    A scratch = new A(); 
    scratch.f(); 
} 

Wenn er gestartet wird, druckt es aus „Unterklasse g()“ statt der erwarteten „Super G()".

Wir erstellen Objekte sowohl der Oberklasse als auch der Unterklasse (das ist durch Reflexion auf einem Glas), kleben sie in einer Karte und ziehen sie dann heraus, wie wir sie brauchen, aber wir haben durch Ausdrucken verifiziert die object.getClass(). getName() und sehen, dass wir tatsächlich mit der Superklasseninstanziierung arbeiten.

Wie auch immer, wenn wir die Anwendung ausführen, verwendet sie aus irgendeinem Grund die Unterklassenkopie der Methode und nicht die Oberklassen, obwohl das Objekt eine Instanziierung der Oberklasse ist (dh es sollte nicht einmal über die Methoden der Unterklassen wissen)). Ist das etwas, das mir und meinen Mitarbeitern nicht bekannt ist? Wir sind völlig ratlos, warum das jemals passieren würde.

+1

Sie machen eine Klasse, um ein Paket zu verlängern ??? Das habe ich noch nie zuvor gesehen! – CodeBlue

+1

Dies ist Java vollständig nicht ausführbar. Wo sind die Funktion Rückgabetypen ???? – ControlAltDel

+0

Ihr Code ist in vielerlei Hinsicht falsch, bitte korrigieren Sie sie zuerst :) – fixmycode

Antwort

0

Kurz gesagt, das einzige, was dies verursachen kann, ist, dass das Laufzeitobjekt eine Instanz von B ist, aber Sie haben es als A deklariert. Wenn die Methode aufgerufen wird, wird Ihr Programm in der Laufzeitklasse von suchen Das Objekt, auf dem es aufgerufen wird, arbeitet sich dann den Vererbungsbaum hoch.

Nebenbei bemerkt, Sie fehlen Konstruktoren, Ihre Klasse B erweitert ein Paket und Ihre Methoden haben keine Rückgabetypen. Das ist völlig invalid Java.

+0

Ich bin mir der Probleme im Beispiel bewusst. Es ist nicht der eigentliche Code. Bitte ignoriere sie und konzentriere dich darauf, was falsch gelaufen ist. Wir haben, wie gesagt, verifiziert, indem wir obj.getClass(). GetName() ausgedruckt haben, dass es sich nicht um eine Instanziierung der Unterklasse handelt. – Luminoth

+0

Ich habe eine Erkältung, tut mir leid, dass ich das gerade nicht gerochen habe. – MarioDS

0

Eine Sache, die die Verwirrung stiften kann als übergeordnete Klasse eine Unterklasse von B mit demselben Namen mit (A) aber auf einem anderes Paket mit ähnlichen Namen des Pakets der A geordneten Klasse.

Abgesehen davon sieht es wie ein Analysefehler aus. Führe deine Schritte zurück. Einige Ideen: Löschen Sie die Klasse B oder machen Sie es uninstallatiable, dann führen Sie es wieder ein und testen Sie es wieder.

+0

Es gibt keine Unterklassen von B und B ist die einzige Unterklasse von A.Wir haben den vollständigen Klassennamen mit obj.getClass(). GetName() ausgedruckt und es wird die fragliche Oberklasse verwendet, nicht die Unterklasse oder irgendeine Klasse in einem anderen Paket. – Luminoth

+0

Beats me dann ... –

+0

Aber es sieht immer noch wie ein Fehler in Ihrer Analyse aus. Führe deine Schritte zurück. Einige Ideen: Löschen Sie die Klasse "B" oder machen Sie sie uninstallierbar, führen Sie sie dann erneut ein und testen Sie sie erneut. –