Java 构造方法

英文标题【Constructors】

一个构造方法用于在对象创建的时候初始化。构造方法与类具有完全相同的名字,构造方法的语法与普通方法的语法也是相似的。

但是,构造方法是没有明确的返回类型的。

通常来说,你需要使用一个构造方法给一个类的实例初始化变量或者运行任何其启动的时候行需要执行的方法来完成对象创建的时候需要进行的功能。

所有类都需要一个构造方法,不管你是否在程序中定义了一个构造方法还是没有定义。因为 Java 将会自动提供一个默认的构造方法来讲所有成员对象进行初始化。然而,如果你已经定义了你自己的构造方法的话,默认的构造方法将不会被使用。

构造方法有下面的一些特性:

  • 构造方法必须与类同名(如果一个源文件中有多个类,那么构造方法必须与公共类同名)
  • 每个类可以有一个以上的构造方法
  • 构造方法可以有0个、1个或1个以上的参数
  • 构造方法没有返回值
  • 构造方法总是伴随着 new 操作一起调用

this 关键字

  • 指代当前对象
  • 指代当前类
  • 指代构造方法 this(): 表示当前类的构造方法,只能放在首行

注意: 在新建对象的时候 实际上调用了类的无参(没有参数)的构造方法一般默认 (在类中可以隐藏)

super 关键字

  • 只能指代父类对象
  • 指代父类的构造方法,只能放在首行

注意:子类必须通过 super 关键字调用父类有参数的构造方法;使用 super 调用父类构造方法的语句必须是子类构造方法的第一条语句

如果子类构造方法没有显式地调用父类的构造方法,则将自动调用父类的默认(没有参数)的构造方法。如果父类没有不带参数的构造方法,并且在子类的构造方法中又没有显式地调用父类的构造方法,则 Java 编译器将报错。

句法

下面是一个构造函数的句法:

class ClassName {
    ClassName() {}
}

Java 允许有下面 2 种类型的构造方法。

  • 无参数构造方法(No argument Constructors)
  • 有参数构造方法(Parameterized Constructors)

无参数构造方法

与这个构造方法的名字一样,无参数构造方法是不在构造方法中接受任何参数的。使用无参数构造方法将会为所有对象初始化一个固定的变量值。

一般情况下,无参的构造方法和带参的构造方法作用类似,都是初始化一些成员变量,有种情况,无参构造方法至关重要,Servlet/JSP 在加载时需调无参构造方法,即如果你定义了带参构造方法,就必须重载一个无参构造方法,方法可以为空。

  • 创建类时指定了有参数构造函数后,系统默认不会创建无参数构造函数,需要自己手动创建。
  • 创建子类的对象实例时,默认会先调用父类的无参数的构造函数(默认构造函数)。
  • 若父类未定义无参数构造函数,则在编译阶段报错。
  • 若子类指定了父类的有参构造函数,则可以通过编译和运行。

示例

Public class MyClass {
    Int num;
    MyClass() {
        num = 100;
    }
}

你可以通过调用构造方法来初始化对象:

public class ConsDemo {
    public static void main(String args[]) {
        MyClass t1 = new MyClass();
        MyClass t2 = new MyClass();
        System.out.println(t1.num + " " + t2.num);
    }
}

上面的方法将会输出下面的运行结果。

100 100

有参数构造方法

在很多时候,你可能需要你的构造方法能够接受一个或者多个参数。

在构造方法中添加参数的方式与在其他方法中添加参数的方式相同,你仅仅需要在构造方法名字的后面的参数表中进行声明就可以了。

示例

下面是一个有关使用构造方法的示例程序:

// A simple constructor.
class MyClass {
    int x;
 
    // Following is the constructor
    MyClass(int i) {
        x = i;
    }
}

你将会通过下面的构造方法对对象的变量进行初始化:

public class ConsDemo {
    public static void main(String args[]) {
        MyClass t1 = new MyClass(10);
        MyClass t2 = new MyClass(20);
        System.out.println(t1.x + " " + t2.x);
    }
}

上面程序运行的输出结果为:

10 20