Comment java auto boxing / unboxing fonctionne?


Depuis JDK 5.0, auto boxing / unboxing a été introduit en java, l'astuce est simple et utile, mais quand j'ai commencé à tester différentes conversions entre les classes wrapper et les types primitifs, je suis vraiment confus comment le concept de boxe automatique fonctionne en java, par exemple:

Boxe

int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error

Après avoir essayé différents cas (short, long, float, double), le seul cas accepté par le compilateur est lorsque le type de la valeur à droite de l'affectation l'opérateur est int. Quand j'ai regardé dans la source de Integer.class, j'ai trouvé qu'il n'implémente qu'un seul constructeur avec le paramètre int.

Donc ma conclusion est que le concept de boxe automatique est basé sur le constructeur implémenté dans la classe wrapper. Je veux savoir si cette conclusion est vraie ou s'il y a un autre concept utilisé par la boxe automatique?

Déballage

Integer intObject = new Integer(0);
byte byteValue = intObject; // ==> Error (the same Error with short)
int intValue = intObject; 
double doubleValue = intObject;

Ma conclusion sur le déballage est que la classe wrapper donne la valeur enveloppée par l'objet dans le type correspondant (Integer ==> int), ensuite, le compilateur utiliser les règles habituelles de la conversion de types primitifs (byte => short => int => long => float => double). Je veux savoir si cette conclusion est vraie ou s'il y a un autre concept utilisé par le déballage automatique?

Merci pour l'avance:)

Author: Naruto Biju Mode, 2014-03-26

3 answers

En cas de doute, vérifiez le bytecode:

Integer n = 42;

Devient:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1      

, Donc dans la réalité, valueOf() est utilisé par opposition au constructeur (et il en va de même pour les autres classes wrapper). Ceci est bénéfique car il permet la mise en cache et ne force pas la création d'un nouvel objet à chaque opération de boxe.

L'inverse est le suivant:

int n = Integer.valueOf(42);

, Qui devient:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: invokevirtual #22                 // Method java/lang/Integer.intValue:()I
8: istore_1      

I. e. intValue() est utilisé (encore une fois, c'est analogue pour les autres types wrapper ainsi). C'est vraiment tout auto(onu)boxe se résume à.

Vous pouvez lire sur les conversions de boxe et de déballage dans JLS §5.1.7et JLS §5.1.8, respectivement.

 12
Author: arshajii, 2014-03-25 23:53:32

Boxe automatique et déballage automatique

La boxe automatique signifie que lorsque nous essayons d'attribuer une donnée primitive à un type d'objet, elle se convertit automatiquement en type d'objet.ce processus appelé boxe automatique.. et quand un type d'objet se convertit en type primitif, il s'appelle unboxing...essayer de le comprendre à partir des exemples suivants.

class Demo{
public static void main(String args[]){
    int x=100;

    //Integer iob=x; //Illegal jdk1.4
    Integer iob=Integer.valueOf(x); //Legal at JDK1.4 =>Boxing

    Integer iob2=x; //Legal JDK1.5 - Autoboxing
    System.out.println(iob2);
}

}

Un autre exemple pour la boxe automatique

class Demo{
public static void main(String args[]){
    Integer iob=new Integer(100);    
    int x;
    x=iob; //Legal => auto unboxing
    System.out.println(x);
}

}

Exemple pour le déballage automatique

class Demo{
public static void main(String args[]){
    Integer iob=new Integer(100);
    int x=iob; //Auto unboxing ==>Assignment

}

}

Merci vous..

 0
Author: Sanu Vithanage, 2016-06-29 16:13:26

Considérez le code suivant comme un exemple de non-boxe automatique:

System.out.println('b'+ new Integer(63));

Voici une ventilation de la façon dont le code ci-dessus est compilé:

Étape 1: L'objet Entier 63 est instancié puis AUTO-DÉBALLÉ en int 63

new Integer(63)

Étape 2: le caractère " b " est converti en valeur numérique, c'est-à-dire 98

Etape 3: les deux valeurs sont ajoutées: 98+63

Étape 4: La sortie est 161

 0
Author: Mark Burleigh, 2016-11-16 12:54:51