2010-07-20 3 views
6

Что происходит, когда объект java.lang.Double инициализируется без использования вызова конструктору, но вместо этого использует примитив? Кажется, он работает, но я не совсем понимаю, почему. Существует ли какое-то неявное преобразование с компилятором? Это использование Java 5.Инициализация двойного объекта с примитивным двойным значением

public class Foo { 

    public static void main(String[] args) { 
     Double d = 5.1; 

     System.out.println(d.toString()); 

    } 

} 
+1

Теперь, зная, что это называется autoboxing, вы можете найти много [интересных статей в SO] (http://stackoverflow.com/search?q= [java] + autoboxing) :) –

+0

Autboxing, вот что я искал для. Спасибо! –

ответ

9

Это называется Autoboxing, которая является функцией, которая была добавлена ​​в Java 5. Она будет автоматически конвертировать между примитивными типами и типами оболочек, таких как double (примитива) и java.lang.Double (обертка объекта). Java компилятор автоматически преобразует строку:

Double d = 5.1; 

в:

Double d = Double.valueOf(5.1); 
5

Это называется AutoBoxing

Autoboxing и Auto-распаковка из примитивных типов Преобразования между примитивными типами, как int, boolean, и их эквивалентные эквиваленты на основе объектов , такие как Integer a nd Boolean, может потребовать ненужные суммы для дополнительного кодирования, особенно если преобразование необходимо только для метода. вызов API Collections для примера .

Автобоксинг и автоматическая распаковка Java-примитивы создают код, который более краткий и легче следовать. В следующем примере: int хранится, а затем извлекается из массива ArrayList . Версия 5.0 оставляет преобразование, необходимое для перехода на целое число и обратно в компилятор.

Перед

ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(0, new Integer(42)); 
    int total = (list.get(0)).intValue(); 

После

ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(0, 42); 
    int total = list.get(0); 
Смежные вопросы