2010-01-05 21 views

risposta

9

Poiché il linguaggio Java Specification says so :)

Negli array linguaggio di programmazione Java sono oggetti (§4.3.1), sono dinamicamente creati, e possono essere assegnati a variabili di tipo Object (§4.3. 2). Tutti i metodi di classe Object possono essere richiamati su un array.

Quindi, a differenza di C++, Java fornisce una vera array come oggetti di prima classe:

  • c'è un membro length.
  • Esiste un metodo clone() che sostituisce il metodo con lo stesso nome nella classe Object.
  • Plus tutti i membri della classe Object.
  • Viene generata un'eccezione se si tenta di accedere a un array fuori limite.
  • Gli array sono istanciati nella memoria dinamica.
0

Così che ottengono tutti i benefici thereof:

  • GetHashCode()
  • toString()

ecc

e array non sono 'primitivi', in modo da se non possono essere primitivi, devono essere oggetti.

+2

In Java, vengono utilizzate le implementazioni di default 'hashCode' e' toString' (vale a dire il codice hash dell'identità e '[LFooBar; @ deadbeef') per gli array, quindi in generale non sono molto utili. :-P –

0

Non sono sicuro del motivo ufficiale.

Tuttavia, per me è logico che siano oggetti perché le operazioni possono essere eseguite su di essi (come ad esempio la lunghezza) e ha più senso supportare queste operazioni come funzioni membro anziché introdurre nuove parole chiave. Altre operazioni includono clone(), le operazioni ereditate dell'oggetto, ecc. Le matrici sono anche lavabili e potenzialmente comparabili.

Questo è diverso da C (e matrici native in C++), in cui gli array sono essenzialmente indicatori di un offset di memoria.

+1

In realtà, prendere la lunghezza di un array Java non è un'operazione. La lunghezza è un membro pubblico dell'oggetto. –

+0

È vero. Non sono sicuro del motivo per cui non hanno inserito un getLength() finale su di essi. – Uri

+0

Gli array non sono confrontabili con l'ordine naturale, ma ovviamente sei libero di scrivere un 'Comparator' che funziona con loro. –

3

Avere array essere oggetti significa che è possibile eseguire operazioni con essi (ad esempio, alcuniArray.count ('foo')) invece di farlo semplicemente contro di loro (ad esempio, count (someArray, 'foo')), che conduce a sintassi più naturale.

+1

Tranne che in Java gli array non hanno metodi aggiuntivi, ad eccezione di 'clone' (che ha il tipo di ritorno covariante corretto, è pubblico e non ha eccezioni controllate). Hanno anche un campo extra, 'length'. Oltre a ciò, non sono disponibili metodi o campi aggiuntivi oltre a quelli forniti con 'Object'. –

1

Un altro punto è che gli oggetti sono mutabili e vengono passati per riferimento. Negli array non ci sono campi/metodi che è possibile utilizzare per modificare le "proprietà" dell'array, ma è sicuro che si possono modificare i valori degli elementi. E i vantaggi del passare gli array per riferimento sono piuttosto ovvi (sebbene i programmatori funzionali probabilmente vorrebbero che Java avesse liste immutabili passate per valore).

Modifica: dimenticato di citare. Nel periodo precedente all'autoboxing, era utile poter archiviare gli array nelle raccolte, scriverli su ObjectStreams, ecc.

+0

Volevo fare +1 su di te per il passaggio per riferimento, ma perché qualcuno dovrebbe voler passare una cosa immutabile per valore? Un grande + immutabile è che puoi passare per riferimento senza timore di effetti collaterali. – ILMTitan

+0

Passare per valore non significa necessariamente copiare il valore. In realtà nelle lingue con trasparenza referenziale: http://en.wikipedia.org/wiki/Referential_transparency_%28computer_science%29 la distinzione è irrilevante. – Dan

1

Questo link spiega perché gli array sono oggetti in Java (all'inizio dell'articolo).

+0

Puoi migliorare la risposta citando le parti essenziali di questo articolo qui perché allo stackoverflow piace portare le informazioni sul posto, presumibilmente come evidenziazione delle parti rilevanti e archiviazione. – n611x007

1

Probabilmente perché volevano avvicinarsi il più possibile a fare di tutto un oggetto. I tipi nativi sono lì per la compatibilità con le versioni precedenti.

Problemi correlati