如何在Java中最好地解释和使用空构造函数?

我一直在自学Java。 我理解定义类的范围,但仍然没有得到空构造函数用法的概念。
通常我们应该传递构造函数的参数来构建实例对象。 但是,我经常看到构造函数的空参数。 例如:

class Person { String name; int age; public Person(); public Person(String name, int age){ this.name = name; this.age = age; } } 

我研究并阅读了一个使用“鱼”类来解释的例子。 所以,这就是我到目前为止所理解的:在定义类时,我们首先定义一个对象的属性,然后我们创建一个构造函数,用于使用方法构建对象。 空构造函数构建GENERIC对象,带有参数的构造函数构建具有更多特定信息的对象。 让我们说上面的例子,如果我使用空构造函数创建一个实例对象:

 Person p1 = new Person(); 

– 它仍会创建一个对象,但没有任何属性? 那么,究竟空构造函数用于什么? 我在很多示例代码中看到了它。 它非常有用/常见吗?

感谢您的回答!

定义默认构造函数有三个常见原因:

  • 构造具有默认值的对象。
  • 初始化在初始化过程中不需要参数的对象。
  • 重新定义构造函数的范围。 使构造函数私有将阻止除了类本身之外的任何人构造一个对象。

如果编写带参数的构造函数,则需要声明默认值(如果要使用它)

 class Person { String name; int age; public Person(String name, int age){ this.name = name; this.age = age; } } 

你现在不能这样做:

 Person p = new Person(); 

为了使用“默认”构造函数(没有参数),您需要声明它:

 class Person { String name; int age; public Person(){ name = "Man With No Name"; //sometimes you will want to set the variables age = 21; //to some default values } public Person(String name, int age){ this.name = name; this.age = age; } } 

我相信其他答案会来,但总之 –

空构造函数只是为您提供该对象的实例。 您可以在其上使用setter来设置必要的属性。 如果要确保创建的任何实例始终有效并且始终初始化任何成员变量,那么您将定义初始化所有必需成员变量的构造函数。

此外,如果您使用Spring之类的框架,则通常使用默认构造函数,其中使用setter注入设置属性。

如今用java编写的许多软件都利用了在运行时直接在代码上运行的框架,它们使用特殊的JVMfunction(称为reflection)来直接访问你的类并乱用它,而不是通过代码访问它你真的写了。

这种库的一个常见例子是Hibernate。 它“神奇地”从关系数据库获取信息,并将数据库值分配给对象的字段。 您的类在运行时添加了额外的代码,以使其神奇地映射回数据库的内容。

reflectionAPI的结果是,对于没有“默认”构造函数的类来说,这是一个真正的痛苦。 您必须提供有关如何以可编程方式解释的方式正确使用类的构造函数的许多其他信息。

相反,这些工具只需要类具有一个空的默认构造函数,以便在运行时轻松增强类。

因此,我们倾向于总是留下一个空的构造函数,即使在没有提供某些值的情况下创建一个对象根据我们程序的API也没有意义。

空构造函数通常是“默认”

 Person() { // This will cause you to not have any name or age values } 

所以我们假设你想要一个默认的Person:

 Person() { this("Steven",20); } 

这样您将调用非空构造函数,但您将始终拥有相同的人

无论您是否定义“空”(默认)构造函数,都允许您向自己和其他开发人员说明是否需要设置某些字段。 (如果构造函数需要它们,则需要它们。)

有些库(例如Google GSON,ORMs ……)要求你有一个空的构造函数,但这是出于技术原因。

要记住的另一件事是,您通常可以将通过构造函数分配的字段声明为final ,既可以进行优化,也可以清楚地表明它们在对象的生命周期内不会更改。

但这完全取决于具体情况和你想要做的事情。