Java

Java 知识量:11 - 45 - 220

3.2 创建和初始化对象><

定义构造方法- 3.2.1 -

构造方法是一种特殊的方法,用于初始化新创建的对象。构造方法的名称必须与类名相同,并且它没有返回类型。下面是定义构造方法的语法:

public class MyClass {  
    // 定义构造方法  
    public MyClass() {  
        // 初始化代码  
    }  
}

上面的代码定义了一个名为 MyClass 的类,并定义了一个名为 MyClass 的构造方法。在这个构造方法中,可以添加初始化代码,用于设置对象的初始状态。

还可以在构造方法中定义参数,以便在创建对象时传递值。例如:

public class MyClass {  
    private int x;  
  
    // 定义带参数的构造方法  
    public MyClass(int x) {  
        this.x = x;  
    }  
}

上面的代码定义了一个带有一个整型参数的构造方法,该参数用于初始化 x 成员变量。在创建对象时,可以按如下方式使用这个构造方法:

MyClass obj = new MyClass(10);

这将创建一个新的 MyClass 对象,并将其 x 成员变量初始化为 10。

定义多个构造方法- 3.2.2 -

可以在一个类中定义多个构造方法,这被称为构造方法的重载(overloading)。构造方法的重载与方法的重载类似,只不过构造方法没有返回类型。

以下是如何在一个类中定义多个构造方法的示例:

public class MyClass {  
  
    private int x;  
    private int y;  
  
    // 构造方法1  
    public MyClass() {  
        this.x = 0;  
        this.y = 0;  
    }  
  
    // 构造方法2  
    public MyClass(int x) {  
        this.x = x;  
        this.y = 0;  
    }  
  
    // 构造方法3  
    public MyClass(int x, int y) {  
        this.x = x;  
        this.y = y;  
    }  
}

在这个例子中,MyClass这个类有三个构造方法。第一个构造方法不接受任何参数,它将x和y初始化为0。第二个构造方法接受一个参数,并将y初始化为0。第三个构造方法接受两个参数,并将它们分别赋值给x和y。

在创建MyClass的实例时,可以根据需要选择使用哪个构造方法。例如:

MyClass obj1 = new MyClass(); // 使用第一个构造方法,x和y都被初始化为0  
MyClass obj2 = new MyClass(10); // 使用第二个构造方法,x被初始化为10,y被初始化为0  
MyClass obj3 = new MyClass(10, 20); // 使用第三个构造方法,x被初始化为10,y被初始化为20


在构造方法中调用其他构造方法- 3.2.3 -

一个构造方法可以调用另一个构造方法。要在构造方法中调用另一个构造方法,可以使用以下语法:

public class MyClass {  
    private int x;  
    private int y;  
      
    public MyClass() {  
        this(0, 0); // 调用另一个构造方法  
    }  
      
    public MyClass(int x, int y) {  
        this.x = x;  
        this.y = y;  
    }  
}

在上面的示例中,MyClass类有两个构造方法。第一个构造方法使用this(0, 0)调用第二个构造方法,以初始化x和y成员变量。

使用this()关键字调用另一个构造方法时,必须在构造方法中的第一行进行调用。这是因为构造方法的目的是初始化对象,所以必须在执行任何其他代码之前调用另一个构造方法。

注意:只能在同一个类中的构造方法之间进行调用,不能调用其他类的构造方法。

字段的默认值和初始化程序- 3.2.4 -

在Java中,每个数据类型都有其默认值,如果程序员没有明确地初始化一个变量,那么该变量将自动被设置为默认值。这些默认值如下:

  • 对于数值类型的基本数据(byte, short, int, long, float, double),默认值是0或0.0。

  • 对于布尔类型(boolean),默认值是false。

  • 对于字符类型(char),默认值是null字符'\u0000'。

然而,对于对象引用类型(类、数组或接口),默认值就是null。如果试图在没有先创建对象的情况下访问对象的方法或属性,程序就会抛出一个NullPointerException。

初始化块或初始化程序在Java中用于初始化类的实例。它们可以是静态的,也可以是非静态的。静态初始化块用于初始化静态变量,而非静态初始化块用于初始化实例变量。它们在以下情况下被调用:

  • 静态初始化块:当类被加载到JVM时,静态初始化块会被调用一次。它通常用于初始化静态变量。

  • 非静态初始化块:每次创建类的实例时,都会调用非静态初始化块。它通常用于初始化实例变量。

以下是使用初始化块的示例:

public class Test {  
    // 静态初始化块  
    static {  
        // 初始化静态变量  
    }  
  
    // 非静态初始化块  
    {  
        // 初始化实例变量  
    }  
}

注意:初始化块在Java中的使用并不常见,通常会直接在构造函数中进行初始化操作。