每当创建一个对象时,一些代码将被执行,以执行该对象的初始化。这段代码只不过是一个构造函数,因此构造函数的主要目的是执行对象的初始化,而不是创建一个对象。让我们来看看编写构造函数的基本规则。它们如下:

  • 类的名称和构造函数的名称必须相同。
  • 返回类型的概念不适用于构造函数,即使是void也不例外。如果我们错误地试图为构造函数声明返回类型,那么我们不会得到一个编译时错误,因为编译器会把它当作一个方法。
  • 构造函数唯一适用的修饰符是:public, private, protecteddefault。如果试图使用任何其他的修饰符,将得到一个编译时错误,说修饰符名称_of_modifier在这里不允许。

默认构造函数

编译器负责生成默认构造函数,而不是JVM。如果没有编写任何构造函数,那么只有编译器会生成默认的构造函数,即如果至少编写了一个构造函数,那么java中的每个类都可以包含一个构造函数,它可以是由编译器生成的默认构造函数,也可以是由程序员明确提供的自定义构造函数,但两者不能同时进行。

默认构造函数的原型如下:

  • 它总是一个无参数的构造函数
  • 默认构造函数的访问修改器与类的访问修改器完全相同。
  • 它只包含一行super(),是一个对超类构造函数的无参数调用。

静态工厂方法

通过使用一个类名,如果我们调用一个方法,并且该方法返回相同的类对象,那么这种类型的方法被称为静态工厂方法。静态工厂方法是返回本地类的一个实例的方法。与构造函数不同的是,静态工厂方法的名称可以明确代码的内容。在静态工厂方法中,不需要在每次调用时创建一个新的对象,即对象可以被缓存并在需要时重复使用。还可以返回其返回类型的子类型。

每个构造函数的第一行应该是super()this(),如果没有写任何东西,那么编译器将总是把super()放在这里。

示例代码:

import java.io.*;
import java.util.*;

// Main class
// To find out complex number
public final class YiibaiDemo {

    public static YiibaiDemo valueOf(float real, float imaginary)
    {
        return new YiibaiDemo(real, imaginary);
    }

    // Constructor
    private YiibaiDemo(float real, float imaginary)
    {
        this.real = real;
        this.imaginary = imaginary;
    }

    private float real;
    private float imaginary;

    // Method 2
    public static void main(String[] args)
    {
        YiibaiDemo n = YiibaiDemo.valueOf(2, 4);

        // Print and display the complex number
        System.out.println(n.real + "+" + n.imaginary + "i");
    }
}

因此,从上述文章中,可以清楚地总结出它们之间的区别,具体如下:

构造函数 静态工厂方法
构造函数没有一个有意义的名字,所以它们总是被限制在标准的命名规则中。 静态工厂方法可以有一个有意义的名字,因此可以明确地表达这个方法的作用。
构造函数不能有任何返回类型,甚至不能有void 静态工厂方法可以返回实现该方法的相同类型、子类型以及基元。
在构造函数中,只能执行对象的初始化。 在静态工厂方法中,除了初始化之外,如果想为每个对象的创建执行任何活动,比如为每个对象的创建增加计数值,可以在静态工厂方法中这样做。
构造函数总是在堆中创建一个新的对象,所以不可能从构造函数中返回一个缓存的类的实例。 但是工厂方法可以利用缓存的优势,即可以从工厂方法中返回同一个Immutable类的实例,而不是总是创建一个新对象。
每个构造函数的第一行应该是super()this() 在工厂方法中,第一行不一定是super()this()