繁体   English   中英

自动装箱和拆箱操作员是否超载

[英]Are autoboxing and unboxing operator overloading

自动装箱和拆箱是否真的是操作员超载的术语? 当我们说Integer i = 10;时会发生什么?

不,这不是运算符重载。 Java没有提供任何用于运算符重载的机制。

Integer i = 10;

就像在说:

Integer i = Integer.valueOf(10);

根本不超载=

在内部编译器生成Integer i=Integer.valueOf(10);

不,自动装箱和拆箱只是“语法糖”。 这意味着还隐含着其他计算(需要以字节码发出),但是编译器会为您轻松地隐藏它们。

Java和Java 5在Java中引入了自动装箱和拆箱。让我们考虑一个示例来理解这些术语。 检查下面的代码,然后考虑是否可以编译...

int sum(int a, int b)
{
  return a+b;
}

Integer I =sum(3,4);

在上面的示例中,如果您尝试使用Java 1.4或更低版本进行编译,则会看到编译错误。 编译器会抱怨方法“ sum”的返回类型和变量“ I”的类型,因为方法返回的是原始数据类型,其中Integer是int的包装类。 但是由于称为自动装箱的功能,相同的代码可以在Java 5上编译并正常运行。 在自动装箱中,编译器将原始数据类型转换为相应的对象包装器类,例如。 从int到Integer,从char到Character等。当将原始类型值分配给相应包装器类的变量时,java编译器将应用自动装箱。 作为参数传递给期望输入参数作为相应包装器类的方法。

泛型很好地利用了自动装箱/拆箱功能,在泛型中我们定义了某种类型(某些包装类对象)的集合,并向其中添加了原始类型数据。 请参阅以下示例

List<Integer> lst=new ArrayList();
lst.add(5);

在类似的路径上,将包装器类型对象转换为其对应的原始类型在Java中称为拆箱。

您可以在http://javatechnologyhelper.blogspot.com/2014/07/autoboxing-unboxing-in-java.html中找到详细信息

自动装箱/拆箱是编译器的功能,因此您无法自己实现。 在Java中不可能发生运算符重载。

这是一个很好的示例(类似于您的要求),它说明了原始类型装箱会发生什么: http : //www.leepoint.net/notes-java/data/basic_types/autoboxing.html

自动装箱:这是将本地数据类型转换为参考数据类型(相对包装器类)的过程。 例如:int x = 5;

Integer ob = new Integer(x);

在此,'x'(int)是首字母,并转换为参考数据类型(整数)。

我们可以在不创建对象的情况下进行自动装箱。

整数ob = x;

在这里,编译器隐式创建一个对象,如上面创建的那样。

自动拆箱:

将参考数据类型转换为优势数据类型的过程。

int x = 5; 整数ob = x; //自动装箱

int x = ob.intValue(); //自动拆箱

在自动拆箱的步骤中,我们可以使用intValue()方法写出来。

int x = ob; //自动拆箱。

在这里,编译器隐式调用intValue()方法。

此功能在2004年的jdk1.5中引入。

就像其他人都说的那样,自动装箱不是运算符重载。 Java的运算符重载仅限于该语言中定义的内容。 因此,例如,每种基本类型(包括对象引用)都有一个=运算符; 逻辑| 和一个int(按位) | ; 等等

装箱和拆箱是转换,与将int转换为float 这是关于在应用操作而不是运算符之前调整类型。

这不是运算符重载,但出于所有实际目的,它与运算符/方法组合重载是同一件事。 正如在其他答案中指出的那样,生成的代码驻留在调用方中,而不是在方法真正重载的情况下驻留在被调用方中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM