2012-02-01 14 views
15

Dlaczego nie możemy zrobić tablic w Javie tak:Tworzenie tablic w Java (C++ Style)

int marks[5]; 

i przypisać wartości po tej deklaracji?

Ktoś proszę wyjaśnić terminologię lub różnicę.

+1

Czy próbowałeś? Jakie są wyniki? –

+3

Czy możesz uzupełnić swoje pytanie, wygląda na to, że pytasz "Dlaczego Java nie używa dokładnie tej samej składni co C++?" To prawdopodobnie tylko ja, pytanie może mieć więcej sensu dla ludzi, którzy znają C++ i Java niż tylko Javę. –

+2

@Tichodroma: prawdopodobnie próbował, a wynikiem był "Błąd składni na tokenie" 5 ", usuń token". –

Odpowiedz

20

Dzieje się tak, ponieważ w Javie nie ma tablic stosów. Oto odpowiednik Java:

int[] marks = new int[5]; 

Wygląda bardzo podobnie do przydzielania tablic o rozmiarach dynamicznych w C++. Oczywiście nie musisz się martwić, dzwoniąc pod numer delete[], ponieważ jest on zbierany.

+0

+1, pokonaj mnie na [to] (http://ideone.com/hdYNT). –

1

Ponieważ tablice są Object -s (dziedziczą z klasy Object). Aby utworzyć obiekt, musisz użyć słowa kluczowego new. (Większość czasu).
Myślę, że przyczyną słowa kluczowego new jest oznaczenie, że zmienne są odniesieniami do dynamicznie przydzielanych wystąpień.

+0

Okay ... Trochę tego teraz ... Dzięki – hk007

13

Ponieważ składnia jesteś powołując alokuje tablicę na stosie, a tablice są obiektami Java, Java i wszystkie obiekty są alokowane na stercie (modulo najnowsze optymalizacje JVM, ale te są ukryte).

I tak musi być w ten sposób w języku bez ręcznego zarządzania pamięcią, ponieważ pliki przydzielane na stosie znikają, gdy wywołanie wraca, prowadząc do zwisających wskaźników, a podstawową cechą Javy nie jest dopuszczenie takich rzeczy.

Oczywiście można argumentować, że Java powinna używać składni alokacji stosów do alokacji sterty, ale to by zmieszało z nikim, kto znał C - niedobrze.

+0

+1 za podanie niejawnych optymalizacji JVM. – dasblinkenlight

5

W Java wielkość matrycy jest określona przez wyrażenie, że tworzy się, na przykład:

int[] marks = new int[5]; 

lub

int[] marks = {1,2,3,4,5}; 

Należy również zauważyć że chociaż składni int marks[] jest dozwolone w Javie (Java ma kilka takich reguł dla zgodności z C++), to nie jest t zalecane, składnia int[] marks jest bardziej idiomatyczna, a zatem preferowana.