2014-11-25 15 views
5

Próbuję przypisać do obiektów klasy super klasy tablicę obiektów podklas. Program kompiluje się pomyślnie, ale otrzymuję numer ArrayStoreException. Wiem, że tablice parent i child są odniesieniami do tej samej tablicy, ale czy nie powinienem mieć dostępu przynajmniej do metody func?Java: obiekt tablicy Super class przypisany do obiektu tablicy podrzędnej

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

jako właściwy kod Java, jesteś bardzo selektywny ze swoją lepkością. Aby uzyskać jednolity kod, potrzebujesz jakiegoś 'public' tam (i chcesz naprawić to białe miejsce w całym miejscu ... pamiętaj, aby przeczytać http://stackoverflow.com/help/how-to-ask - the" pamiętajcie, aby sprawdzić "część nie jest tam dla zabawy." Wiele osób, wliczając w to, zapomnij) –

Odpowiedz

4

Nie możesz tego zrobić:

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

Należy spróbować zrobić to:

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

To dlatego, że najpierw przypisuje tablicę Pclass do odniesienia dziecko, które tylko mają obiekty klasy Cclass, a następnie próbujesz przypisać obiekt Pclass do referencji nadrzędnej, co nie jest dozwolone!

zobaczyć, co się dzieje, że po utworzeniu obiektu Cclass na stercie kiedy napisał nowy Cclass, chociaż obiekty Cclass była zerowa w tablicy ale teraz będzie przyjmować tylko obiekty Cclass czy to obiekty podklasy za

więc przypisanie obiektu Pclass byłoby nielegalne!

Powód coraz wyjątek czasu wykonywania, a nie kompilacji:

Kompilator sprawdza tylko, czy zajęcia są w tej samej hierarchii dziedziczenia lub nie, ponieważ są one w tej samej hierarchii dostaniesz wyjątek Runtime.

+0

OP wie, że nie może tego zrobić - pytanie brzmi: * dlaczego * nie? Twoja alternatywna sugestia nie ma nic wspólnego z pytaniem.-1 – drewmoore

+0

@drewmoore potrzeba czasu, aby napisać pełną odpowiedź :) –

+0

downvote anulowany, ale nadal nie odpowiedziałeś na to pytanie. Przyczyną nieporozumień jest problem z odniesieniem do wartości – drewmoore

0

Choć odniesienie do tablicy jest Pclass, że obiekt array jesteś przedstawieniu jest typu Cclass (ty instancja obiektu new Cclass[]. Nie można zmienić typ obiektu poprzez zmienną innego typu odniesienia go). Nie można przechowywać obiektu Pclass w tablicy Cclass.

Zamiast tego, jeśli to możliwe, należy utworzyć obiekt za pomocą podtyp:

parent[0] = new Subclass(); 
1

Jeśli czytasz spec ArrayStoreException, można dowiedzieć się, że jest rzucony to indicate that an attempt has been made to store the wrong type of object into an array of objects.

Stworzyliście instancję z tablicy Cclass, więc tylko te instancje z Cclass (lub jego podklas) mogą być przechowywane w tej tablicy. Fakt, że przechowujesz odwołanie do tej instancji w zmiennej typu Pclass[], nie zmienia tego.

0

Ty faktycznie instancja obiektu klasy dziecko w linii: Cclass[] child = new Cclass[10]; i podczas wystąpień obiekt nadrzędny użyciu new Pclass(); utworzeniu rodzica object.When przypisać go do obiektu podrzędnego refernce rzutowanie w dół występuje w czasie wykonywania i to nie dlatego, że ciebie starają się przechowywać obiekt nadrzędny w referencji podrzędnej.Należy przesłać ArrayStoreException tj. próbujesz zapisać niewłaściwy typ obiektu w tablicy obiektów.