C'è qualche ragione per cui un array in Java è un oggetto?In Java, perché gli oggetti array sono? Ci sono dei motivi specifici?
risposta
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 classeObject
. - 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.
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.
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 –
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.
In realtà, prendere la lunghezza di un array Java non è un'operazione. La lunghezza è un membro pubblico dell'oggetto. –
È vero. Non sono sicuro del motivo per cui non hanno inserito un getLength() finale su di essi. – Uri
Gli array non sono confrontabili con l'ordine naturale, ma ovviamente sei libero di scrivere un 'Comparator' che funziona con loro. –
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.
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'. –
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.
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
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
Questo link spiega perché gli array sono oggetti in Java (all'inizio dell'articolo).
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
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.
- 1. Cosa sono gli oggetti mock in Java?
- 2. Perché non ci sono ObservableQueues in JavaFX?
- 3. Ci sono dei buoni browser degli oggetti R?
- 4. Ci sono dei buoni motivi per usare lo spostamento dei bit, ad eccezione della matematica veloce?
- 5. In C# ci sono oggetti Lambda Expressions?
- 6. Perché gli oggetti immutabili sono thread-safe?
- 7. Ci sono dei buoni benchmark Clojure?
- 8. Perché gli array non sono espandibili?
- 9. Gli oggetti jQuery sono immutabili?
- 10. Ci sono dei puntatori in javascript?
- 11. Poiché tutti gli oggetti sono creati con "nuovo" in Java, significa che sono tutti creati sull'heap?
- 12. Le applicazioni win32 non sono così orientate agli oggetti e perché ci sono così tanti puntatori?
- 13. Ci sono funzioni inline in java?
- 14. perché ci sono più fcntl.h in linux?
- 15. Ottieni oggetti specifici da ArrayList quando gli oggetti sono stati aggiunti in modo anonimo?
- 16. Cosa sono gli oggetti immutabili?
- 17. Gli oggetti Doctrine sono ENORME
- 18. Cosa sono gli oggetti differiti?
- 19. Perché gli oggetti tipo array sono utilizzati in Javascript su matrici native
- 20. perché gli oggetti di dettatura sono inattuabili in python?
- 21. Perché non ci sono classi nei metodi in Ruby?
- 22. Ci sono specialità all'interno dei campi incorporati
- 23. Java: gli array 1-d sono sempre contigui in memoria?
- 24. Quali spazi dei nomi simbolo ci sono in Haskell?
- 25. Perché gli array 0d in Numpy non sono considerati scalari?
- 26. Perché non ci sono raccolte simultanee in C#?
- 27. Perché gli interi sono immutabili in Python?
- 28. Ci sono ORM (OKM) per gli archivi di valori-chiave?
- 29. Perché utilizzare gli array paralleli in Java?
- 30. Perché non ci sono funzionalità di riallocazione negli allocatori C++?
Bene, gli array non sono certamente primitivi. –
di che provenienza vieni? C? – hasen