# Java 创建类 – 如何创建对象？

> 原文： [https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/](https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/)

在[*面向对象*](https://howtodoinjava.com/oops/object-oriented-principles/)范式中，类是编程的基本单位。 在本教程中，学习**编写 Java 类**和**如何在 Java 中创建对象**。

## 1\. 类与对象

在 Java 中，**对象**是具有数据结构的容器，它们具有**状态和行为**。 对象代表系统或应用程序中的参与者。 例如，在 HR 应用程序中，参与者是雇员，经理，部门或报告。 对象是类的实例。

**类**是描述其对象的状态和行为的模板。

## 2\. 如何声明一个类

在 Java 中声明类的一般语法为：

```java
<<modifiers>> class <<class name>> {

        // fields and members of the class
}

```

*   类声明可能具有**零个或多个修饰符**。
*   关键字`class`用于声明一个类。
*   `<<class name>>`是该类的用户定义名称，应为有效标识符。
*   每个类都有一个主体，该主体在一对大括号（`{…}`）中指定。
*   类的主体包含其不同的组件，例如字段，方法等。

例如，

```java
public class Main 
{
	// Empty body for now; Write we own
}

```

#### 2.1 类的类型

在 Java 中，可以有两种类型的类。

1.  **抽象类** - 这些类是`abstract`。 这些是**不完整的类**。 这意味着您无法创建此类的实例。 您只能扩展这些类以完成其规范。
2.  **非抽象类** – 这些类定义其完整状态和行为。 他们是完整的类。 您可以创建此类的对象。

## 3\. Java 类的渐进性

在 Java 中，类用作**模板来创建对象**。 Java 中的类可能包含五个主要组件。 即：

1.  字段
2.  方法
3.  构造器
4.  静态初始化器
5.  实例初始化器

**字段**和**方法**也被称为**类成员**。 **构造器**和两个**初始化器**都用于在类初始化期间使用，即使用类模板创建对象。

构造器用于创建类的对象。 我们必须为类至少具有**构造器**（如果我们明确声明，则 JVM 为我们注入默认构造器）。

初始化器用于初始化类的字段。 我们可以有零个或多个静态或实例类型的初始化器。

#### 3.1 字段

类的字段表示该类对象的属性（也称为状态属性）。 这些字段在类的主体内声明。

在类中声明字段的一般语法为：

```java
public class Main 

        // A field declaration
        <<modifiers>> <<data type>> <<field name>> = <<initial value>>;
}

```

假设`Human`类的每个对象都有两个属性：名称和性别。 `Human`类应该包括两个字段的声明：一个代表姓名，另一个代表性别。

```java
public class Human {

        String name;
        String gender;
}

```

`Human`类在此处声明两个字段：名称和性别。 这两个字段均为`String`类型。`Human`类的每个实例（或对象）都将具有这两个字段的副本。

#### 3.2 方法

Java 方法是语句的集合，这些语句被组合在一起以执行操作。 方法通常用于修改类字段的状态。 通过调用其他对象中的方法，方法也可以用于委派任务。

在 Java 中，方法可以：

*   接受零个或多个参数
*   返回`void`或单个值
*   重载 – 意味着我们可以定义多个具有相同名称但语法不同的方法
*   被覆盖 – 意味着我们可以在父类和子类中使用相同的语法定义方法

```java
public class Human {

        String name;
        String gender;

        public void eat() {

        	System.out.println("I am eating");
        }
}

```

#### 3.3 构造器

构造器是一个命名的代码块，用于在创建对象后立即初始化该类的对象。 构造器声明的一般语法为：

```java
<<Modifiers>> <<Constructor Name>>(<<parameters list>>) throws <<Exceptions list>> {

        // Body of constructor goes here
}

```

*   构造器可以将其访问修饰符设为`public`，`private`，`protected`或包级别（无修饰符）。
*   构造器名称与类的简单名称相同。
*   构造器名称后跟一对左括号和右括号，其中可能包含参数。
*   可选地，在右括号后面可以加上关键字`throws`，而关键字`throws`之后是逗号分隔的异常列表。
*   与方法不同，构造器没有返回类型。
*   我们甚至不能将`void`指定为构造器的返回类型。 如果有任何返回类型，则为方法。
*   请记住，如果构造的名称与类的简单名称相同，则它可以是方法或构造器。 如果指定返回类型，则为方法。 如果未指定返回类型，则为构造器。

#### 3.4 实例初始化块

我们看到，构造器用于初始化类的实例。 实例初始化块（也称为**实例初始化器**）也用于初始化类的对象。

实例初始值设定项只是类体内的代码块，但不包括任何方法或构造器。 实例初始化器没有名称。 它的代码只是放在开括号和闭括号内。

请注意，实例初始化器在实例上下文中执行，并且关键字`this`在实例初始化器中可用。

```java
public class Main 
{
	{
		//instance initializer block
	}
}

```

*   一个类可以有多个实例初始化器。
*   对于我们创建的每个对象，所有初始化器都将按文本顺序自动执行。
*   所有**实例初始化器的代码都在任何构造器**之前执行。
*   **实例初始化器不能具有`return`语句**。
*   除非所有已声明的构造器在其`throws`子句中列出那些受检的异常，否则它不会抛出受检的异常。

```java
public class Main {

    //instance initializer
    {
        System.out.println("Inside instance initializer");
    }

    //constructor
    public Main()       
    {
        System.out.println("Inside constructor");
    }

    public static void main(String[] args) {
        new Main();
    }
}

Output:

Inside instance initializer
Inside constructor

```

#### 3.5 静态初始化块

*   [静态](https://howtodoinjava.com/oops/java-static-keyword/)初始化块也称为**静态初始化器**。
*   它类似于实例初始化块，但用于初始化类。
*   实例初始化器对每个对象执行一次，而静态初始化器仅在将类定义加载到 JVM 中时对一个类执行一次。
*   为了区别于实例初始化器，我们需要在其声明的开头使用`static`关键字。
*   我们可以在一个类中有多个静态初始化器。
*   所有静态初始值设定项均按其出现的文本顺序执行，并在任何实例初始值设定项之前执行。

静态初始化器无法引发受检异常。 它不能有一个`return`语句。

```java
public class Main {

    //static initializer
    static {
        System.out.println("Inside static initializer");
    }

    //constructor
    public Main()       
    {
        System.out.println("Inside constructor");
    }

    public static void main(String[] args) {
        new Main();
    }
}

Output:

Inside static initializer
Inside constructor

```

## 4\. 如何创建对象？

在 Java 中，要通过类创建对象，请使用`new`关键字及其构造器之一。

```java
<<Class>> <<variable>> = new <<Call to Class Constructor>>;

//e.g.

Human human = new Human();

```

请记住，当我们不向类添加构造器时，Java 编译器会为我们添加一个构造器。 Java 编译器添加的构造器称为**默认构造器**。 默认构造器不接受任何参数。 类的构造器的名称与类的名称相同。

在`new`运算符之后，将调用正在创建其实例的类的构造器。`new`运算符通过在堆中分配内存来创建类的实例。

## 5\. `null`引用类型

Java 具有称为`null`类型的特殊引用类型。 它没有名字。 因此，我们不能定义空引用类型的变量。 空引用类型只有 Java 定义的一个值，即**空字面值**。 它只是`null`。

空引用类型是与任何其他引用类型兼容的分配。 也就是说，我们可以将空值分配给任何引用类型的变量。 实际上，存储在[引用类型](https://howtodoinjava.com/java/basics/data-types-in-java/)变量中的空值表示该引用变量没有引用任何对象。

```java
// Assign null value to john

Human john = null;  	// john is not referring to any object
john = new Human(); 	// Now, john is referring to a valid Human object

```

请注意，`null`是`null`类型的字面值。 我们无法为[基本类型](https://howtodoinjava.com/java/basics/primitive-data-types-in-java/)变量分配`null`，因此 Java 编译器不允许我们将基本值与`null`值进行比较。

这是有关在 Java 中创建类的非常基础的教程的全部内容。

学习愉快！

了解更多信息： [Oracle Java Doc](https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html)