# Java 构造器

> 原文： [https://howtodoinjava.com/oops/java-constructors/](https://howtodoinjava.com/oops/java-constructors/)

**Java 构造器**是特殊的方法（无返回类型），可让您在对象状态可以由应用程序内的其他类使用之前完全初始化。 使用`new`关键字调用 Java 中的构造器。

让我们更深入地了解构造器。

```java
Table of Contents

What is Java Constructor
Types of Constructors
	i) Default Constructor (no-arg constructor)
	ii) Parameterized Constructor
Constructor Rules
Constructor Chaining
Private Constructor
```

## Java 中的构造器是什么

构造器是一种特殊的方法，类似于（没有确切的方法）构造，它可以帮助程序员编写[对象初始化](https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html)代码，然后该对象可用于应用程序中的其他对象。

每当应用程序需要任何类的新实例时，JVM 就会在堆内部分配一个内存区域。 然后，JVM 执行调用的构造器（类可以具有多个构造器）并初始化对象状态。 在构造器内部，您可以访问所有对象属性并将其分配给它们的默认值或任何所需的值。

> 阅读更多： [Java 内存模型](//howtodoinjava.com/java/garbage-collection/jvm-memory-model-structure-and-components/)

## 构造器的类型

1.  **默认构造器（无参构造器）**

    如果程序员在类定义中不提供任何构造器 – JVM 在运行时为该类提供默认构造器。

    程序员还可以覆盖类中的默认构造器。 让我们看一下语法。

    ```java
    public class Employee 
    {	
    	public Employee() {

    	}
    }

    ```

    在默认构造器中，构造器的名称必须与类名称匹配，并且不应具有任何参数。

2.  **带有构造函数重载的参数化构造器**

    如上所述，一个类中可以有多个构造器。 这可以通过重载构造器来实现。 在**构造器重载**中，您可以根据要求传递参数列表，即，可以使用几种方法初始化类。

    ```java
    public class Employee {
    	private String firstName;
    	private String lastName;

    	public Employee() {	//constructor 1

    	}

    	public Employee(String firstName) { //constructor 2

    	}

    	public Employee(String firstName, String lastName) { //constructor 3

    	}
    }

    ```

    在上面的类中，我们定义了 3 个构造器来处理 3 种情况 – 应用程序可能需要如何创建员工对象，即不使用名称，仅使用名字以及同时使用名字和姓氏。

    ```java
    Employee employee1 = new Employee();
    Employee employee2 = new Employee("Lokesh");
    Employee employee3 = new Employee("Lokesh", "Gupta");

    ```

## 构造规则

在 Java 中创建构造器的强制性规则很少。

1.  构造器名称必须与类的名称相同。
2.  构造器定义中不能有任何返回类型。
3.  构造器中不能有任何`return`语句。
4.  构造器可以由不同的参数重载。
5.  如果要使用`super()`，即超类构造器，则它必须是构造器中的第一条语句。

## 构造器链接

在 Java 中，可以在构造器中调用其他构造器。 就像方法调用一样，但是没有任何引用变量（显然，实例已完全初始化）。

现在，我们可以调用相同类或父类的构造器。 两者使用不同的语法。

#### 调用同一个类的构造器

要从同一类调用其他构造器，请使用`this`关键字。 例如：

```java
public Employee() {	

}

public Employee(String firstName) { 
	this();		//calling default constructor
}

public Employee(String firstName, String lastName) {
	this(firstName);	//calling constructor with single argument of String type
}

```

#### 调用超类构造器

要从父类或父类调用构造器，请使用`super`关键字。 `super`关键字的用法类似于`this`关键字 – 唯一的区别是`super`引用超类，`this`引用当前实例。

```java
public Employee() {	
	//refer to Object class constructor 
	//as it is parent class for every class
	super();	
}

```

## 私有构造器

有时您想保护构造器以免被其他类调用。 总之，您希望没有人能够创建该类的新实例。

为什么有人要那个？ 好吧，这对于[单例模式](//howtodoinjava.com/design-patterns/creational/singleton-design-pattern-in-java/)是必要的。 在单例中，应用程序希望只有任何一个类的一个实例。

常见的单例类定义如下所示：

```java
public class DemoSingleton implements Serializable 
{
    private static final long serialVersionUID = 1L;

    private DemoSingleton() {
        // private constructor
    }

    private static class DemoSingletonHolder {
        public static final DemoSingleton INSTANCE = new DemoSingleton();
    }

    public static DemoSingleton getInstance() {
        return DemoSingletonHolder.INSTANCE;
    }

    protected Object readResolve() {
        return getInstance();
    }
}

```

这就是 Java 中的**构造器**。 将我的问题放在评论部分。

学习愉快！