Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么整数和整数可以互换使用?_Java_Autoboxing - Fatal编程技术网

Java 为什么整数和整数可以互换使用?

Java 为什么整数和整数可以互换使用?,java,autoboxing,Java,Autoboxing,我不明白为什么整型和整型在Java中可以互换使用,即使一个是基元类型,另一个是对象 例如: Integer b = 42; int a = b; 或 Java支持并自动将原始值包装到对象中,并将对象展开为特定类型的原始值,如char-Character,int-Integer,double-double,等等 注: 那么什么时候应该使用自动装箱和取消装箱呢?仅当引用类型和基本体之间存在“阻抗不匹配”时才使用它们,例如,当必须将数值放入集合时。对于科学计算或其他性能敏感的数字代码,不适合使用自

我不明白为什么整型和整型在Java中可以互换使用,即使一个是基元类型,另一个是对象

例如:

Integer b = 42;
int a  = b;

Java支持并自动将原始值包装到对象中,并将对象展开为特定类型的原始值,如
char
-
Character
int
-
Integer
double
-
double
,等等

注:


那么什么时候应该使用自动装箱和取消装箱呢?仅当引用类型和基本体之间存在“阻抗不匹配”时才使用它们,例如,当必须将数值放入集合时。对于科学计算或其他性能敏感的数字代码,不适合使用自动装箱和取消装箱。整数不能代替整数;自动装箱和取消装箱模糊了基元类型和引用类型之间的区别,但它们并没有消除它。

因为自动装箱和自动取消装箱

它被称为。这将准确地解释它是什么。

这篇文章的前几句话描述得非常好:

不能将int(或其他基元值)放入集合中。集合只能保存对象引用,因此必须将基元值装箱到适当的包装器类中(在int的情况下是整数)。当您将对象从集合中取出时,您将得到输入的整数;如果需要int,则必须使用intValue方法取消对整数的装箱。所有这些装箱和拆箱都是一件痛苦的事情,会把代码弄得乱七八糟。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱

简而言之就是这样。它允许您利用primatives的Collections框架,而无需自己完成工作


主要的缺点是,它会使新程序员感到困惑,如果不正确理解和使用它,可能会导致混乱/混乱的代码。

java语言规范规定java虚拟机必须执行

除了其他答案之外,因为是一个包装类,它允许您装箱和取消装箱
int
值。其他信息。

使用
int
整数
“可交换地”调用。这个特性是在Java5中引入的。在此之前,您的示例代码不会编译。相反,您必须编写如下内容:

Integer b = Integer.valueOf(42); // or new Integer(42);
int a  = b.intValue();

这相当冗长,这就是为什么引入了自动装箱。这是一个编译器的魔术,使生活更容易的编码器

从技术上讲,
int
Integer
本身是不可互换的,一个不能用于需要另一个的地方。但是,自动装箱允许在两者之间进行隐式转换

作为旁注,有一种情况下自动装箱(特别是取消装箱)失败。如果您的代码尝试自动取消对空值的绑定,则在运行时将得到一个
NullPointerException
,例如:

Integer b = null;
int a = b; // NullPointerException here!
只是一些需要注意的事情

int d = 12;
Integer c = Integer.valueOf(d); // or new Integer(d);
Integer b = null;
int a = b; // NullPointerException here!