为什么我可以将原语传递给接受对象的方法?

时间:2013-10-15 16:42:01

标签: java pass-by-reference primitive pass-by-value

为什么可以将原语传递给接受对象的方法?原始变成了一个对象吗?比如int = Integer和boolean = Boolean?

我可以调用以下函数:

hash(41, 0);

    public static int hash(int seed, Object object)
    {
        int result = seed;
        if(object == null)
        {
            return hash(result, 0);
        }
        else if(!isArray(object))
        {
            result = hash(result, object.hashCode());
        }
        else
        {
            int length = Array.getLength(object);
            for(int index = 0; index < length; ++index)
            {
                Object item = Array.get(object, index);
                // prevent looping if item in array references the array itself
                if(!(item == object))
                {
                    result = hash(result, item);
                }
            }
        }
        return result;
    }

3 个答案:

答案 0 :(得分:5)

是的,这称为拳击转换int值被“加框”为Integer,即Object。它从1.5开始就在Java中提供。

JLS, Section 5.1.7列出了可用的装箱转换:

  

拳击转换将基本类型的表达式转换为   相应的引用类型表达式。具体来说,   以下九次转换被称为拳击转换:

     
      
  • 从类型布尔值到类型布尔

  •   
  • 从类型字节到类型字节

  •   
  • 从短类型到短类型

  •   
  • 从char类型到Character

  •   
  • 从int类型到Integer类型

  •   
  • 从long类型到Long

  •   
  • 从float类型到Float类型

  •   
  • 从类型double到类型Double

  •   
  • 从null类型到null类型

  •   

此外,在方法调用转换期间允许装箱转换,这正是这里发生的事情。该值正在转换为另一种类型,因为int 0正在传递给期望Object的方法。 JLS, Section 5.3,将装箱转换列为方法调用转换的一种方法:

  

方法调用上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)

  •   
  • 扩大原始转换(第5.1.2节)

  •   
  • 扩大参考转换(第5.1.5节)

  •   
  • 拳击转换(§5.1.7),可选地后跟加宽引用   转化

  •   
  • 取消装箱转换(第5.1.8节),可选地后跟加宽   原始转换。

  •   

答案 1 :(得分:1)

是的,你可以。名为autoboxing/unboxing的东西由编译器自动完成。以下是文档的摘录。

  

Autoboxing是Java编译器自动转换   原始类型与其对应的对象包装器之间   类。例如,将int转换为Integer,将double转换为a   双,等等。如果转换是另一种方式,那就是   称为拆箱。

int i = 1;
Integer boxI = i; // Autoboxing is performed automatically by the compiler

Integer ii = 1;
int i = ii; // Auto(un)boxing is performed automatically by the compiler

答案 2 :(得分:0)

是的,原始转换为Object,反之亦然,这个概念称为装箱和拆箱。在较新版本的java中,这是自动完成的,因此称为自动装箱和自动拆箱。

Oracle doc for Boxing and UnBoxing

每个原语都有相应的Wrapper类。

  • int - &gt;整数
  • 布尔值 - &gt;布尔
  • char - &gt;字符

等等。