为什么我们需要Java中的默认无参数构造函数?

RRR*_*R_J 15 java constructor default-constructor

为什么我们在许多Java相关API中需要一个默认的无参数构造函数?像一般规则一样,所有java bean类或实体类(JPA等)或JAX-WS实现类都需要显式的无参数构造函数.

如果默认情况下Java提供了无参数构造函数,那么为什么这些标准中的大多数需要显式构造函数?

Sto*_*ica 16

如果没有定义其他构造函数, Java仅提供默认的无参数构造函数.因此,如果您有其他构造函数,则必须自己明确定义一个无参数构造函数.

这些框架使用反射API并查看方法名称以确定如何设置属性.构造函数的参数只能通过类型而不是名称来查找,因此框架无法可靠地将属性与构造函数args匹配.因此,它们需要一个无参数构造函数来创建对象,然后可以使用setter方法来初始化数据.


pol*_*nts 11

我相信需要publicnullary构造函数的框架是这样做的,因为它们使用反射来实例化类型,例如通过Class.newInstance().

至于为什么默认构造函数可能不适用于这种情况,这里是相关的JLS部分:

JLS 8.8.9默认构造函数

如果a不class包含构造函数声明,则会自动提供不带参数的默认构造函数:

  • 如果class声明了public,则默认构造函数被隐式赋予访问修饰符public;
  • 如果声明了类protected,则默认构造函数被隐式赋予访问修饰符protected;
  • 如果声明了类private,则默认构造函数被隐式赋予访问修饰符private;
  • 否则,默认构造函数具有无访问修饰符隐含的默认访问权限.

因此,在public类中,默认构造函数具有正确的可见性,但是否则public必须提供明确的可见性.