[Java] 构造函数是什么?

首先,我是一名初学者,希望通过撰写这篇文章来总结自己在Java方面的学习成果,包括通过阅读相关文本材料等途径进行的学习。

构造函数是什么?

这是指与类名相同的方法,在实例生成后自动执行的方法。

创建实例后,按照以下方式设置初始值。(因为新生成的实例字段(如name和hp)为空)

public class Main {
    public static void main(String[] args) {
        Hero h1 = new Hero();
        h1.name = "タロウ";
        h1.hp = 100;
        ...
    }
}

在真实的开发现场中,由于通常需要多人合作进行开发,几乎不可能一个人完成所有的开发工作。
因此,在创建类时需要考虑到其他开发人员也会使用这个类。
并且,并不能保证每个开发者都能正确地给变量赋值。
为了应对这种情况,Java允许预先定义「在实例被创建后自动执行的操作」。
而这个操作就是构造函数。

public class Hero {
    String name;
    int hp;
    ...
    public Hero() {
        thie.hp = 100;
    }
}

这个类添加了一个名为Hero()的方法。
因此,这个类在被实例化后会自动执行该方法。

另外,构造函数是无法由我们开发者直接调用的。
但以下情况可以调用。

    • オーバーロードしたコンストラクタから、別のコンストラクタを呼び出せる( this(); )

 

    • 継承した場合は子のコンストラクタ内で、親のコンストラクタを呼び出せる( super(); )

特に継承した場合、子クラスのコンストラクタで super(); をつけないと、親クラスの初期化が行われずに問題になることがある。必要に応じて super(); を呼ぶこと。

这是在实例创建时由JVM调用的。

JVM:Java虚拟机。用于执行Java程序的软件。

构造函数的定义方式

被视为构造函数的条件。

    1. 方法名称与类名完全相等

 

    方法声明中未写明返回值(不能是void)
public class クラス名 {
 クラス名() {
  自動的に実行する処理
 }
}

如果只是要把固定值如100赋值给字段变量的话,只需使用字段声明 int hp = 100; 就可以了。
当有复杂条件时,建议使用构造函数。

什么是复杂的条件?

在构造函数中接受参数作为附加信息。
public class Hero {
    String name;
    int hp;
    ...
    public Hero(String name) {
        thie.hp = 100;
        this.name = name;
    }
}

在创建新对象时,还可以指定名称的初始值。

以下是传递参数给 new 的写法。

public class Main {
    public static void main(String[] args) {
        Hero h1 = new Hero("ハナコ");
        ...
    }
}
由于过载,可以有多个定义。

※ 方法重载:指的是在同一个类中定义多个同名方法,但参数不同。

public class Hero {
    String name;
    int hp;
    ...
    public Hero(String name) {
        thie.hp = 100;
        this.name = name;
    }
    // 今回追加したコンストラクタ
    public Hero() {
        thie.hp = 100;
        this.name = "テスト";
    }
}

要使用重载了构造函数的类,请参考以下内容。

public class Main {
    public static void main(String[] args) {
        Hero h1 = new Hero("ハナコ"); // h1.nameはハナコ
        Hero h2 = new Hero();        // h2.nameはテスト
        ...
    }
}
隐式构造函数

每个类都必须具有一个或多个构造函数定义。
只有当类没有任何构造函数定义时,编译器才会自动定义一个无参数且没有处理内容的默认构造函数。

public class Map {
    ...
    public Map() {
    }
}

用普通的方式写下来是这样的:

public class Map {
    ...
}

这可以。

广告
将在 10 秒后关闭
bannerAds