【问题标题】:Why don't Java wrapper classes have no-arg constructors?为什么 Java 包装类没有无参数构造函数?
【发布时间】:2009-05-17 12:40:09
【问题描述】:

在包装类中不提供无参数构造函数的理由是什么?我知道它们天生就是为 Wrapping 原始类型而构建的,所以正确的方法是为构造函数提供原始类型。

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

此外,如果它们有无参数构造函数,它们可以被实例化为T.class.newInstance()。但是,由于newInstance() 需要无参数构造函数,因此这不适用于包装类。

【问题讨论】:

  • 您的术语不正确。当您不提供无参数构造函数时,编译器会提供默认构造函数。见java.sun.com/docs/books/tutorial/java/javaOO/constructors.html
  • 这并不完全不正确。 “包装”类没有默认构造函数,因为它们的源代码中都至少有一个构造函数。
  • @John - 你自己的引用说你是不正确的:“编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。”编译器只为没有构造函数的类提供无参数 ctor。
  • duffymo:不,我认为参考文献与约翰和 JLS 一致。
  • @Tom 我认为@duffymo 是对的。仅当您根本不提供构造函数时才提供默认构造函数。包装类没有提供默认构造函数,因为它们已经有一个构造函数。

标签: java wrapper


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为这是因为由这些类包装的值是 final 不可变的( 是我正在寻找的词,谢谢 Bill:))。如果有一个默认构造函数,那将毫无用处,因为您无法更改该类包装的原语。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          只有对象有构造函数,基元没有构造函数,所以它们没有默认构造函数。基元通过将对象/值初始化为所有 0 字节来获得它们的默认值。 (boolean 为 false,float 为 0.0f,double 为 0.0,null 作为参考)

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2014-06-18
              • 2023-03-12
              • 1970-01-01
              • 2010-10-24
              • 2015-10-03
              • 1970-01-01
              • 2015-01-22
              • 2010-09-21
              相关资源
              最近更新 更多