2009-09-13 11 views

risposta

46

Alcuni tipi di dati sono considerati "primitivi", ovvero non sono trattati come un oggetto e non hanno le proprietà di un oggetto.

Sulla maggior parte delle piattaforme, numeri interi e caratteri sono esempi di tipi che sono primitivi ma possono essere inseriti in una scatola.

La boxe significa avvolgerli in un oggetto in modo che abbiano il comportamento di un oggetto.

Il significato e il comportamento esatti dipendono dalla lingua che si sta utilizzando. Alcuni linguaggi (come Smalltalk ... almeno waakay quando lo stavo facendo ...) non permettono alcun tipo di primitivo e considerano tutto come un oggetto, ma c'è una penalità legata alle prestazioni associata a questo perché, alla fine del giorno, il processore ha bisogno di lavorare con numeri grezzi e memoria grezza per fare un lavoro utile. Se si desidera aggiungere due numeri interi che sono stati inseriti in una casella, ad esempio, dietro le quinte sono "unboxed" in tipi primitivi, i numeri vengono aggiunti e vengono quindi inseriti in un nuovo numero intero.

3

Un tipo di casella indica che i valori sono allocati in un blocco sull'heap e sono referenziati tramite un puntatore. Ciò è positivo per l'uniformità nell'implementazione del runtime (facilita l'uso di funzioni generiche, ecc.), Al costo di un'ulteriore indiretta.

0

Generalmente quando si lavora con le raccolte, si ha a che fare con gli array di oggetti. In lingue come Java, c'è una differenza tra un primitivo e un oggetto. Quando una primitiva è "inscatolata", è essenzialmente solo un involucro attorno a una primitiva, quindi funziona bene con il resto del framework che si aspetta un oggetto.

Autoboxing è solo l'atto di mettere un oggetto primitivo in un oggetto o di estrarre un oggetto primitivo da un oggetto in modo trasparente, in modo da non doversi preoccupare del passaggio extra di farlo da soli.

12

Sì, boxing significa prendere un tipo di valore e avvolgerlo in un tipo di riferimento. Dal momento che Java ha introdotto autoboxing si può fare:

void foo(Object bar) {} 
//... 
    foo(1); 

e Java verrà automaticamente girare l'int 1 in un intero. Nelle versioni precedenti che avrei dovuto fare:

foo(new Integer(1)); 

Autoboxing è più utile in Java quando si lavora con i generici, dal momento che non è possibile utilizzare primitive con i generici, in modo da memorizzare interi in un elenco, devi avere per creare un List<Integer> e inserire gli interi nella lista.

11

Informazioni più specifiche per Java:

Autoboxing permette java per convertire automaticamente le cose come boolean e int alle loro versioni Object Boolean e Integer automaticamente nella maggior parte dei casi. Permette anche il contrario.

Ad esempio:

int a = 3; // no boxing is happening 
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3 
int c = b; // these same versions also automatically convert Integer 3 to int 3 

più vecchio versioni di Java che non hanno autoboxing richiederà questo codice per fare la stessa cosa:

int a = 3; // works the same 
Integer b = new Integer(3); //must set up a Integer object manually 
int c = b.intValue(); //must change Integer object to a primitive 

Tuttavia, ci sono alcuni scenari in cui si hanno ancora fare le cose manualmente. Per esempio, immaginate di avere una classe con due metodi in questo modo:

assertEquals(int a, int b); 
assertEquals(Object a, Object b) 

Ora, se si tenta di fare questo:

Integer a = 3; 
int b = 3; 
assertEquals(a, b); // this will not compile 

La ragione per cui questo non funziona è perché non può capire se è necessario unbox a a int o casella b a Integer. Pertanto è ambiguo che si debba chiamare la firma del metodo. Per risolvere questo problema si può fare uno di questi:

assertEquals((int) a, b); 
assertEquals(a, (Integer) b); 
0

Boxed significa che hanno preso un tipo di valore normale e ha creato un oggetto intorno ad esso. Un po 'come metterlo in una scatola. Questo è generalmente da evitare, a causa del sovraccarico di costruzione dell'oggetto.