12

我一直在自学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();  

-- 它仍然会创建一个对象,但其中没有任何属性?那么,空构造函数到底是做什么用的呢?我在很多示例代码中看到了它。它非常有用/常见吗?

感谢您的关注和回答!

4

6 回答 6

12

如果你写一个带参数的构造函数,那么你需要声明一个默认的(如果你想使用它)

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;
    } 
 } 
于 2013-09-24T23:53:09.043 回答
11

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

  • 构造一个具有默认值的对象。
  • 在该初始化过程中初始化不需要参数的对象。
  • 重新定义构造函数的范围。将构造函数设为私有将阻止除类本身之外的任何人构造对象。
于 2013-09-24T23:51:39.173 回答
3

我相信会出现其他答案,但简而言之-

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

此外,如果您使用 Spring 等框架,则通常在使用 setter 注入设置属性的情况下使用默认构造函数。

于 2013-09-24T23:52:01.897 回答
2

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

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

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

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

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

于 2013-09-24T23:49:25.417 回答
2

如今,许多用 java 编写的软件都利用了在运行时直接在代码上运行的框架,通过使用特殊的 JVM 功能(称为反射)直接访问您的类并对其进行处理,而不是通过代码访问它你真的写了。

这种库的一个常见示例是 Hibernate。它“神奇地”从关系数据库中获取信息并将数据库值分配给对象的字段。您的类通过在运行时添加的附加代码得到增强,使其神奇地映射回数据库的内容。

反射 API 的结果是,使用没有“默认”构造函数的类真的很痛苦。您必须提供很多关于如何以可以编程方式解释的方式正确使用类的构造函数的附加信息。

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

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

于 2013-09-24T23:54:55.070 回答
0

无论您是否定义“空”(默认)构造函数,都可以让您自己和其他开发人员清楚,是否需要设置某些字段。(如果构造函数需要它们,它们是必需的。)

某些库(例如 Google GSON、ORM ...)要求您有一个空的构造函数,但这是出于技术原因。

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

但这一切都取决于情况和你想要做什么。

于 2013-09-24T23:51:56.353 回答