2016-06-08 15 views
8

classe Object è super-classe per ogni classe in Java. Quindi ogni classe dovrebbe inerente le proprietà o il comportamento della classe Object.Se un array di Object è un Object, perché un array di String not a String

Poi possiamo dichiarare array di oggetti come mostrato di seguito:

Object c = new Object[] {1,2,"22" }; 

Poi, quando viene a stringa perché qui di seguito dichiarazione è sbagliato:

String s = new String[]{"s","s"}; 
+9

'new String [] { "s", "s"}' è di tipo 'String []', 'non STRING'. 'Object []' è una sottoclasse di 'Object', che è il motivo per cui il primo funziona. –

+0

String [] s = new String [] {"s", "s"}; – star

+0

@AndyTurner Ok, quindi 'String []' non è sottoclasse di 'String'. –

risposta

22

new String[]{"s","s"} è di tipo String[], non String. T[] non è una sottoclasse di T (a meno che lo T non sia il Object).

Object[] è un sottotipo di Object, motivo per cui il primo funziona. Infatti, tutti i tipi di array sono subtype of Object, compresi, forse a sorpresa, gli array di primitivi, come int[], anche se int non è un Object (*).

Si potrebbe scrivere il primo utilizzando i tipi più specifici:

Object[] c = new Object[] {1,2,"22" }; 

È possibile scrivere il secondo come una delle seguenti:

String[] s1 = new String[]{"s","s"}; 
Object[] s2 = new String[]{"s","s"}; 
Object s3 = new String[]{"s","s"}; 

Per inciso, s2 dimostra che gli array in Java è covariante. Questo è un problema, dal momento che si può legalmente scrivere:

s2[0] = new Object(); 

che fallire in fase di esecuzione con una ArrayStoreException, dal momento che non è possibile memorizzare Object riferimenti in un String[].

Questo è uno dei motivi per cui autori come Josh Bloch danno il consiglio "Preferisco le liste per gli array" (vedi Effective Java 2 ° Ed Articolo 25), dal momento che le collezioni di Java come List non sono covarianti, e quindi non fare subire lo stesso problema


(*) solo per aggiungere alla confusione, gli array primitivi non sono sottotipi di Object[], come primitivi non sono sottotipi di Object. Ad esempio, sarebbe un errore di compilazione a scrivere:

Object[] illegal = new int[5]; 
3

Un po 'confusamente, un Object[]è un Object. (Per prima cosa, in questo modo, Java può implementare array a lunghezza zero e consentire agli array di essere valori di ritorno delle funzioni).

Assegnare quindi un'istanza Object[] a un riferimento di tipo Object ha senso.

Ma assegnando un'istanza String[] a un riferimento di tipo String fa non senso. (Ma nota che String[] è anche e Object.)

Così

  1. Object c = new Object[] {1,2,"22" }; ha senso
  2. String s = new String[]{"s","s"}; Non ha senso
  3. Object s = new String[]{"s","s"}; ha senso
0
Object c = new Object[] {1,2,"22" }; 

è valido a causa del fatto che una serie di Object s è ancora un Object. Si potrebbe specificare che c è un array di Object s a livello di dichiarazione anche, in questo modo:

Object[] c = new Object[] {1,2,"22" }; 

Tuttavia,

String s = new String[]{"s","s"}; 

non è valido, in quanto una serie di String s non è un String. È necessario sia per convertire l'array in un String, come questo:

String s = String.join(",", new String[]{"s","s"}); 

o per conservarla come una matrice, in questo modo:

String[] s = new String[]{"s","s"}; 
1

Il suo principio di base di Java, Tutto è un Object, in tal modo è possibile utilizzare oggetti di riferimento per tutto come Object o = new AnyOtherClass()

È possibile utilizzare di riferimento di una classe per le sue lezioni di sub, come List l = new Arraylist()

Ma String [] è un Array e Array non è un antenato di String

0

Innanzitutto, matrice contiene il riferimento di valori che sono in mucchio.

In secondo luogo, la classe Object è la classe madre di ogni altra classe in java. così l'array di oggetti può contenere qualsiasi tipo di valore di riferimento ma l'array di stringhe manterrà solo il riferimento del tipo di dati stringa e ogni riferimento si riferirà alla stringa separata (string[0]= "a",string[1]="stackOverFlow"...).

In terzo luogo, una stringa è una sequenza di caratteri in java.

così, una matrice di sting non può essere una stringa perché non si riferisce alla sequenza di caratteri ma si riferisce al tipo di stringa di oggetti che risiedono nell'heap.

1

array è una raccolta di oggetti o raccolta di tipi di dati primitivi mentre stringa è una sequenza di caratteri. come sapete oggetto è super classe di ogni altra classe è per questo che un fatto come di seguito: Object c = new Object[] {1,2,"22" };

classe String non è super classe di tipo array ... quindi non è possibile eseguire come qui di seguito ..

String s = new String[]{"s","s"}; 

speranza che questo vi aiuterà ...

Problemi correlati