2014-11-25 11 views
5

Ich versuche, eine Unterklasse Objekt-Array zu seiner Super-Klasse zuweisen. Das Programm kompiliert erfolgreich, aber ich bekomme eine ArrayStoreException. Ich weiß, dass Arrays Eltern und Kind sind Verweise auf das gleiche Array, aber sollte ich nicht in der Lage sein, mindestens auf Methode func zugreifen?Java: Super-Klassen-Array-Objekt zugewiesen mit Sub-Klasse Array-Objekt

class Pclass 
{ 
    Pclass() 
    { 
     System.out.println("constructor : Parent class"); 
    } 

    public void func() 
    { 
     System.out.println("Parent class"); 
    } 
} 

class Cclass extends Pclass 
{ 
    Cclass() 
    { 
     System.out.println("Constructor : Child class"); 
    } 

    public void func2() 
    { 
     System.out.println("It worked"); 
    } 

    public void func() 
    { 
     System.out.println("Common"); 
    } 
} 

public class test 
{  
    public static void main(String ab[]) 
    {  
     Cclass[] child = new Cclass[10]; 
     Pclass[] parent = child; 
     parent[0]=new Pclass(); 
     parent[0].func(); 
    } 
} 
+0

als richtiger Java-Code, Sie sind sehr selektiv mit Ihrer Sichtbarkeit. Um einen einheitlichen Code zu erhalten, benötigen Sie ein "public" (und Sie möchten das Leerzeichen überall korrigieren ... denken Sie daran, http://stackoverflow.com/help/how-to-ask - die " denken Sie daran, Korrektur zu lesen "Teil ist nicht dort nur zum Spaß. Viele Leute, Sie eingeschlossen, vergessen zu) –

Antwort

4

Sie dies nicht tun können:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Pclass(); 

Sie sollten dies versuchen zu tun:

Cclass[] child = new Cclass[10]; 
Pclass[] parent = child; 
parent[0]=new Cclass(); 

Das liegt daran, Sie zuerst die pClass Array mit dem Kind Referenz zugeordnet, die nur Haben Sie Cclass-Objekte, dann versuchen Sie, Pclass-Objekt der Elternreferenz zuzuweisen, das ist nicht erlaubt!

See, was passiert ist, dass Sie ein cClass Objekt auf dem Heap erstellt haben, wenn Sie neue C-Klasse geschrieben, obwohl die C-Klasse Objekte im Array null waren, aber jetzt würden sie nur cClass Objekte akzeptieren oder es ist Unterklasse der Objekte

Das Zuweisen des Pclass-Objekts wäre also illegal!

Grund für eine Laufzeitausnahme bekommen und keine Zeit kompilieren:

Der Compiler prüft nur, ob die Klassen in der gleichen Vererbungshierarchie sind oder nicht, da sie in der gleichen Hierarchie sind Sie eine Runtime Exception.

+0

OP weiß, dass er das nicht tun kann - die Frage ist * warum * nicht? Ihr alternativer Vorschlag hat nichts mit der Frage zu tun.-1 – drewmoore

+0

@drewmoore es braucht Zeit, um die vollständige Antwort zu schreiben :) –

+0

downvote resigniert, aber Sie haben immer noch nicht wirklich diese Frage beantwortet. Die zugrunde liegende Verwirrung ist ein Verweis-vs-Wert Problem – drewmoore

0

Obwohl die Referenz auf das Array Pclass ist, sie Array-Objekt Sie verweisen ist vom Typ Cclass (Sie instanziiert das Objekt new Cclass[]. Sie sind nicht die Art des Objekts, indem eine Variable eines anderen Typs verweisen sie ändern können). Sie können kein Pclass-Objekt in einem Array Cclass speichern.

Stattdessen, wenn möglich, sollten Sie das Objekt mit dem Subtyp erstellen:

parent[0] = new Subclass(); 
1

Wenn Sie die Spezifikation von ArrayStoreException lesen, würden Sie es geworfen to indicate that an attempt has been made to store the wrong type of object into an array of objects.

Sie eine Instanz erstellt herauszufinden eines Arrays Cclass, so dass nur Instanzen von Cclass (oder Unterklassen davon) in diesem Array gespeichert werden können. Die Tatsache, dass Sie die Referenz dieser Instanz in einer Variablen vom Typ Pclass[] speichern, ändert das nicht.

0

Sie haben instanziiert tatsächlich ein Kind Klassenobjekt in der Zeile: Cclass[] child = new Cclass[10]; und wenn Sie ein übergeordnetes Objekt new Pclass(); mit instanziiert erstellen Sie das übergeordnete object.When Sie es Objekt refernce Kind zuweisen die Downcasting zur Laufzeit auftritt, und es schlägt fehl, da Sie versuchen, das übergeordnete Objekt in einer untergeordneten Referenz zu speichern. Daraufhin wird ArrayStoreException ausgelöst, dh Sie versuchen, den falschen Objekttyp in einem Array von Objekten zu speichern.