2016-08-21 76 views
-3

如果Integer,Boolean等被称为“......拳击”,如果它们的行为不像可以通过“通过参考”传递盒装对象并拆箱来改变它们的值,那么它有什么意义?Java中的自动装箱原语有什么意义?

下面是我实际发现的“取消装箱”的示例并非真正拆箱。

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; 
    } 

它打印真实和9 btw。

+3

Java是由* *价值传球,总是,没有例外。您正在更改方法内的引用,这不会影响原始传递的值。还记得'Integer'是*不可变*。 – Maroun

+0

但是不是'num = 5;'认为拆箱?所以它改变了对象内部的值,并且这个对象的引用是相同的。 @MarounMaroun – shinzou

回答

0

自动装箱是自动转换,Java编译器使得原始类型及其相应的对象包装 类之间 。例如,将int转换为整数,双精度转换为双精度,等等。如果转换以其他方式进行,则这是 称为取消装箱。 参考:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

什么是Java中自动装箱原语的意义呢?

  1. 可以为您节省一些时间。

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

为什么整数/浮点/小数对象?(使用整数来解释)

  • 在Maroun的回答说的Integers/Floats/Doubles etc.的ArrayList。

  • Java库中的一些内置函数返回Integer对象。因此,您可以使用自动装箱将值存储在primitive int中,而不是使用returnedIntegerObject.intValue()

  • 让我们转换String s="5"为整数。

    • 使用内置函数public static Integer valueOf(String s)。正如你可以看到这个函数的返回类型是Integer而不是int

    没有自动装箱:

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

    自动装箱

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

    这些包装类的重点主要是泛型。在Java中,如果我想让整数的ArrayList,我不能做到以下几点:

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

    这是行不通的,因为仿制药只为对象的工作,和“INT”是一种原始的。通过使用包装,

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

    我可以解决这个问题。