为什么Java包装类没有no-arg构造函数?

时间:2009-05-17 12:40:09

标签: java wrapper

在Wrapper类中不提供no-arg构造函数的理由是什么?我知道它们本身是为包装原始类型而构建的,所以正确的方法是为构造函数提供原始类型。

但是,考虑到原始类型没有arg构造函数,为什么它们没有?

此外,如果他们没有arg构造函数,则可以将它们实例化为T.class.newInstance()。但是,由于newInstance()需要no-arg构造函数,因此无法使用Wrapper类。

6 个答案:

答案 0 :(得分:11)

包装器对象是不可变的。这意味着一旦包装器对象分配了一个值,就无法更改该值。为无法更改其值的对象设置默认值没有多大意义。你不会想要获得一个包装类的newInstance(),因为那样你就会陷入默认值。

答案 1 :(得分:2)

我认为这是因为这些类包含的值意味着 final 不可变( 是我正在寻找的单词,感谢Bill :))。如果有一个默认的构造函数,它将毫无用处,因为你以后无法更改该类包装的原语。

答案 2 :(得分:2)

在构造函数中提供基本类型没有用处。包装类的类型表示基本类型。由于实例化的包装器对象不能更改(不可变),因此只有一次机会为其赋值:在构造期间。如果包装类对象不是不可变的,那么可能会发生奇怪的事情。 如果你有一个默认的包装类构造函数,它的值是什么?

答案 3 :(得分:1)

一个更好的问题是他们为什么要有构造函数。我们应该只对价值感兴趣。对象标识与类型的含义无关。

大多数(但不是全部)使用反射都是毫无意义的。像这样构造一个不可变的值几乎没有价值。由于其异常行为,Class.newInstance特别邪恶。 T.class其中T是一个通用参数,因擦除而无法编译。

答案 4 :(得分:1)

只有对象具有构造函数,基元没有构造函数,因此它们没有默认构造函数。由于对象/值被初始化为全0字节,原语获得其默认值。 (布尔值为false,浮点数为0.0f,double为0.0,null为引用)

您似乎想要使用newInstance()创建一个对象,但是唯一未初始化的值为null。

答案 5 :(得分:0)

最有可能的原因是,虽然基元具有默认值(0,0.0f,0.0,0L,false等),但Wrappers通常将这些默认值表示为null。