Double vs double в java [дубликат]

Возможные Дубликаты:
Java: разные двойные и двойные по сравнению

в образце java-программы для одной из моих лабораторий у меня есть два разных метода, принимающих двойные и двойные параметры соответственно.
Как я различаю их, когда передаю им аргументы?

7 ответов


во-первых, вам нужно понять разницу между этими двумя типами. double - Это примитивный тип, а Double - это объект.

код ниже показывает перегруженный метод, который, как я предполагаю, похож на ваш лабораторный код.

void doStuff(Double d){ System.out.println("Object call"); }
void doStuff(double d){ System.out.println("Primitive call"); }

существует несколько способов вызова этих методов:

doStuff(100);
doStuff(200d);
doStuff(new Double(100));

эти вызовы приведут к:

"Primitive call"
"Primitive call"
"Object call"

может быть null, когда double не могу.


// Method A
public static void foo(Double d) {...}

// Method B 
public static void foo(double d) {...}

очевидно, если вы проходите Double объект Метод A будет называться, т. е. если у вас было что-то вроде:

Double d = new Double(1.0);

далее, Если вы передадите двойной литерал, вы вызовете Метод B. Что интересно, если у вас есть что-то вроде

double d = new Double(1.0);

в этом случае Метод B и будет называться, потому что тип of d is double; the Double объект получает неупакованное на double. На той же ноте, если бы у вас было:

Double d = 1.0;

затем Метод A будет называться, потому что типа d будет Double (the double-литерал получает autoboxed к Double).


- double является примитивным типом, где as Double - это фантик объекта.

- один из наиболее распространенных объектов обертки используется с Collection .

например:

List<Double> d = new ArrayList<Double>();

- на Java 5 механизм Autoboxing была представлена конвертировать между ними напрямую.

например:

double d = 10.41;
Double wrapper = d;

что у вас есть пример способ перегрузки. Хорошая часть заключается в том, что компилятор и JVM автоматически выбирают правильный метод на основе типа аргументов, которые используются при вызове метода.


Double является ссылочным типом и double - тип значения.

на Double class обертывает значение примитивного типа double в объекте. Объект типа Double содержит одно поле типа double."ссылке

как @ Fess упомянул и потому Double является ссылочным типом, он может быть null.

если вы хотите, вы можете explictly конвертировать из Double до double С .doubleValue() метод и viceverrsa с new Double(1.0).

также как @millimoose сказал:

вы должны использовать X.valueOf() вместо new X(). The valueOf методы позволяют кэшировать типы бокса, чтобы уменьшить использование памяти. (Не уверен, что это сделано для Doubleно это хорошая привычка.)"


Double - это класс-оболочка, а double-примитивный тип, такой как c/C++. Как указывалось выше, Double в основном используется в дженериках, но также полезен везде, где есть необходимость в числовом значении и правильной инкапсуляции объекта. В большинстве случаев Double и double можно использовать взаимозаменяемо.