È un array un oggetto in java


93

In java possiamo dichiarare un array come

String[] array = new String[10]; 
int size = array.length; 

Ciò significa che l'array stesso è un oggetto? Perché in C ++ un array è solo un puntatore e non ha metodi.


5
No, in C ++ un array è un array e non un array.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
Oh, e in C ++, sia gli array che i puntatori sono oggetti.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Tutti gli array C ++ sono effettivamente oggetti C ++, ma ci sono puntatori C ++ che non sono oggetti C ++, vale a dire tutti i puntatori che sono il risultato della valutazione di un rvalue. Gli esempi includono &x, p+ie new int(42).
fredoverflow

1
@skaffman Il messaggio non è strettamente necessario, poiché altrimenti non verrebbe compilato.
shmosel

Risposte:



60

Sì; la specifica del linguaggio Java scrive :

Nel linguaggio di programmazione Java, gli array sono oggetti (§4.3.1), vengono creati dinamicamente e possono essere assegnati a variabili di tipo Object (§4.3.2). Tutti i metodi della classe Object possono essere richiamati su un array.


Se array è un oggetto, non significa che è un'istanza di una classe? In caso affermativo, posso estendere quella classe?
Uno due tre

9
No, non è così: la specifica Java scrive : "Un oggetto è un'istanza di classe o un array. Un'istanza di classe viene creata esplicitamente da un'espressione di creazione di istanze di classe (§15.9). Un array viene creato esplicitamente da un'espressione di creazione di array (§15.10). ". E no, non è possibile estendere un array, perché la clausola extends deve contenere un ClassType.
Meriton

36

Bene, chiediamo a Java!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Produzione:

true
true

1
Puoi anche dichiarare int[] someIntegers = {42};, allo stesso risultato.
Holger

7

Sì, è un oggetto in Java.

Nota anche che quando lo fai array.lengthnon stai invocando alcun metodo ma stai solo accedendo al lengthcampo dell'array . Ci sono molti metodi statici nella classe Arrays .


3

Sarebbe importante notare che gli array in Java hanno i propri byte code che non condividono con gli oggetti. Sono certamente oggetti, ma vengono gestiti in modo leggermente diverso a livello basso.


2

Direi che la risposta è sì, anche se potrei aggiungere che, in senso stretto, un array è anche un oggetto in C ++. Dal §1.8 [intro.object] dell'attuale standard (FDIS):

Un oggetto è una regione di immagazzinamento.



1

Ogni array in java è un oggetto ex int [] a = new int [2]; Quindi new è usato per creare un oggetto e poiché è un oggetto possiamo controllare il nome della classe semplicemente usando a.getClass (). GetName ();


1
  1. Un array non è un'istanza di nessuna classe elencata nell'albero delle classi, tuttavia ogni array è un oggetto e eredita direttamente da java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. La classe java.util.Arraysè una classe di supporto e gli array non sono istanze di questa classe.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. La classe java.lang.reflect.Arrayè una classe di supporto e gli array non sono istanze di questa classe.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Gli array ereditano tutti i membri di java.lang.Object

  2. Gli array sovrascrivono il metodo clone()ereditato da Object.

  3. Gli array implementano il campo length, che contiene il numero di componenti dell'array. la lunghezza può essere positiva o zero. È publice final.

  4. Gli array implementano le interfacce Cloneablee java.io.Serializable.

8a. Gli array sono supportati da Class<T>. È possibile recuperare l' Class<T>istanza da un'istanza dell'array

(new int[2]).getClass()

o da un tipo di matrice

int[].class

8b. Viene java.lang.Class<T>creata un'istanza di classe di riflessione univoca (ovvero un'istanza di ) per ogni diverso tipo di matrice nel codice. Esempi

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Per ripetere: gli array sono oggetti ma non sono istanze di nessuna classe nell'albero delle classi.

RIFERIMENTI

Dalla specifica Java Sezione 4.3.1 Oggetti

  • Un oggetto è un'istanza di classe o un array.

  • Un'istanza di classe viene creata esplicitamente da un'espressione di creazione di istanze di classe.

  • Un array viene creato esplicitamente da un'espressione di creazione di array.

Da java.util.Arrays

  • Questa classe contiene vari metodi per manipolare gli array (come l'ordinamento e la ricerca)

Da java.lang.reflect.Array

  • La classe Array fornisce metodi statici per creare e accedere dinamicamente agli array Java.

Dalla sezione 10.1 Oggetti

  • La superclasse diretta di un tipo di array è Object.

  • Ogni tipo di array implementa le interfacce Cloneablee java.io.Serializable.

Dalla sezione 10.7 Membri array

I membri di un tipo di matrice sono tutti i seguenti:

  • Il campo finale pubblico length, che contiene il numero di componenti dell'array. la lunghezza può essere positiva o zero.

  • Il metodo pubblico clone, che sostituisce il metodo con lo stesso nome nella classe Objecte non genera eccezioni verificate. Il tipo restituito dal clonemetodo di un tipo di matrice T[]è T[].

  • Un clone di un array multidimensionale è superficiale, vale a dire che crea solo un singolo nuovo array. I sottoarray sono condivisi.

  • Tutti i membri ereditati dalla classe Object; l'unico metodo di Object che non viene ereditato è il suo metodo clone.


1

Gli array di qualsiasi cosa sono oggetti. Si possono chiamare metodi come equals, hashcodeecc:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Non si possono chiamare metodi su un tipo nativo.


0

Osserva lo snippet di codice e l'output di seguito.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

chiaramente l'array a è trattato come oggetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.