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

时间:2013-09-24 23:45:50

标签: java constructor

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

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

感谢您的回答!

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

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

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;
    } 
 } 

答案 2 :(得分:3)

我相信其他答案会随之而来 -

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

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

答案 3 :(得分:1)

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

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

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

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

通过这种方式,您将调用非空构造函数,但您将始终拥有相同的人

答案 4 :(得分:1)

现在用java编写的许多软件都利用了在运行时直接在代码上运行的框架,它们使用特殊的JVM功能(称为反射)来直接访问你的类并乱用它,而不是访问它通过你实际编写的代码。

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

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

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

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

答案 5 :(得分:0)

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

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

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

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