Java:如果Character是包装器类,为什么“ Character newChar ='c'”有效?怎么不需要构造函数?

问题描述

这些对我都很好:

示例1:

Character newCharacter = 'c';

示例2:

Character newCharacterOther = new Character('c');

但是有什么区别?

在第一个示例中,Character类如何知道如何将其值设置为“ c”而无需构造函数

它在幕后使用工厂方法吗?有人可以向我解释编译器如何知道该怎么做吗?

我在java.lang中提供了Character.class构造函数的图像。

它甚至说它已被弃用,不应该这样访问它,但我仍然有些困惑。

Image showing the constructor of a java class

解决方法

in the language spec所述:

分配上下文允许使用以下之一:

  • ...
  • 拳击转换(第5.1.7节)
  • ...

引用section 5.1.7

具体来说,以下九种转换称为装箱转换:

  • ...
  • 从char类型到Character类型
  • ...

在运行时,装箱转换如下进行:

  • ...
  • 如果p是char类型的值,则装箱转换将p转换为类型为r的引用Character,例如r.charValue() == p
  • ...

因此,您的行等效于:

Character newCharacter = Character.valueOf('c');

的确,如果您对类进​​行反编译,您会发现这正是被调用的。


但是有什么区别?

保证

new Anything创建Anything的新实例(否则会失败,但会出现异常)。因此,new Character('c') == new Character('c')始终为假。

另一方面,Character.valueOf('c') == Character.valueOf('c') 可能为真,因为不需要方法调用来返回新实例。实际上,通过规范保证了您不会在这两次调用中获得新实例。

这使您可以重用现有实例,避免不必要的分配,从而节省内存。