2016-08-21 1 views
-3

Quel est le point d'avoir Integer, Boolean etc et les appeler "... boxe" si elles ne se comportent pas comme des objets en boîte que vous pouvez passer "par ref" et faire unboxing pour changer leur valeur?Quel est le but des primitives à autoboxing dans Java?

Voici un exemple de "déballage" qui, en fait, n'a pas vraiment déballé.

public static void main(String[] args) { 
     Boolean x = true; 
     foo(x); 
     System.out.println(x); 

     Integer num = 9; 
     bar(num); 
     System.out.println(num); 
    } 

    private static void bar(Integer num) { 
     num = 5; 
    } 

    static void foo(Boolean x){ 
      boolean y = false; 
      x = y; 
    } 

il imprime vrai et 9 btw.

+3

Java est * passe par la valeur *, toujours, sans exception. Vous modifiez la référence dans la méthode, ce qui n'affectera pas la valeur d'origine transmise. Rappelez-vous également que 'Integer' est * immuable *. – Maroun

+0

Mais «num = 5» n'est-il pas considéré comme unboxing? Donc, cela change la valeur à l'intérieur de l'objet et la référence à cet objet est la même. @MarounMaroun – shinzou

Répondre

0

Autoboxing est la conversion automatique que le compilateur Java fait entre les types primitifs et leur emballage d'objets correspondant classes. Par exemple, convertir un int en entier, un double en un double , et ainsi de suite. Si la conversion va dans l'autre sens, c'est appelé unboxing. Référence: https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

Quel est le point de primitives autoboxing en Java?

  1. Pourrait vous faire gagner du temps.

    int s=4; Integer s1=new Integer(s); //without autoboxing Integr s1=s; //autoboxing (saves time and some code) int k=s1; //unboxing

Pourquoi Integer/flotteur/objets Décimal? (en utilisant Entiers pour expliquer)

  1. Un ArrayList de Integers/Floats/Doubles etc. comme indiqué dans la réponse de Maroun.

  2. Certaines fonctions intégrées de la bibliothèque Java renvoient des objets Integer. Donc, vous pouvez simplement stocker les valeurs dans un primitive int en utilisant l'autoboxing au lieu d'utiliser returnedIntegerObject.intValue().

Convertissons String s="5" en entier.

  • Utilisation de la fonction intégrée public static Integer valueOf(String s). Comme vous pouvez voir le type de retour de cette fonction est Integer et non int.

Sans Autoboxing:

Integer a=Integer.valueOf(s); 
int b= a.intValue(); //getting the primitive int from Integer Object 

Avec Autoboxing

int b=Integer.valueOf(s); //saves code and time 
0

Le point d'avoir ces classes d'emballage est la plupart du temps pour les génériques. En Java, si je voulais faire un ArrayList d'entiers, je ne procédez comme suit:

ArrayList<int> intList = new ArrayList<int>() 

Cela ne fonctionnera pas, car les génériques ne fonctionnent que pour les objets, et un « int » est une primitive. En utilisant le wrapper,

ArrayList<Integer> intList = new ArrayList<Integer>() 

Je peux résoudre ce problème.