13

我很困惑为什么 Integer 和 int 可以在 Java 中互换使用,即使一个是原始类型而另一个是对象?

例如:

Integer b = 42;
int a  = b;

或者

int d = 12;
Integer c = d;
4

7 回答 7

13

发表文章的前几句话描述得很好:

您不能将 int (或其他原始值)放入集合中。集合只能保存对象引用,因此您必须将原始值装入适当的包装类(在 int 的情况下为 Integer)。当你从集合中取出对象时,你会得到你放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。

简而言之,基本上就是这样。它允许您利用原始集合框架,而无需自己完成工作。

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

于 2011-08-19T12:37:39.723 回答
8

Java 支持自动装箱并自动将原始值包装到对象中,并将对象解包为某些类型的原始值,例如char- Characterint- Integerdouble-Double等。

Oracle 文档中的注释:

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

于 2011-08-19T12:32:46.583 回答
4

由于自动装箱和自动拆箱http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

于 2011-08-19T12:34:14.233 回答
3

使用 anint和 an Integer“可互换”称为autoboxing。此功能是在 Java 5 中引入的。在此之前,您的示例代码不会编译。相反,您必须编写如下内容:

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

或者

int d = 12;
Integer c = Integer.valueOf(d); // or new Integer(d);

这相当冗长,这就是引入自动装箱的原因。让编码人员的生活更轻松是一种编译器魔法。

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

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

Integer b = null;
int a = b; // NullPointerException here!

只是需要注意的事情...

于 2011-08-23T01:04:45.970 回答
1

它被称为自动装箱。这将准确地解释它是什么。

于 2011-08-19T12:34:54.937 回答
0

除了其他答案,因为Integer是一个包装类,它可以让您对int值进行装箱和拆箱。其他信息在这里

于 2011-08-19T13:32:44.330 回答
-1

Java 语言规范规定,Java 虚拟机必须对整数和其他一些类型执行自动装箱/拆箱

于 2011-08-19T12:37:54.643 回答