【Java】关于构造函数

我简单地总结了一下。

构造函数是一个什么概念

    • インスタンス化のタイミングで呼び出される特殊なメソッド

 

    コンストラクターではメンバー変数の初期化など、事前処理系を記述するのが一般的

首先,我们来执行以下的示例代码。

public class Person {
  public String name;
  public int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public Person() {
    this("えんどうゆうき", 27);
  }

  public void show() {
    System.out.printf("%s(%d歳)です。\n", this.name, this.age);
  }
}
public class ConstructorBasic {

  public static void main(String[] args) {
    var p = new Person();
    p.show();
  }
}
えんどうゆうき(27歳)です。

处理成功。

如果更改了此处超载的构造函数的参数,则执行结果将不同。

  public Person() {
    this("えんどうゆず", 10);
  }

执行结果

えんどうゆず(10歳)です。

如果在重载构造函数中不使用this关键字进行构造函数调用,则执行结果如下。

  public Person() {
  }
null(0歳)です。

这是因为成员变量具有零值。※局部变量必须进行初始化。

我曾经以为如果不进行构造函数的重载就不会出错,但是出现了以下错误。

public class Person {
  public String name;
  public int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

    /*
     * public Person() { this("えんどうゆず", 10); }
     */

  public void show() {
    System.out.printf("%s(%d歳)です。\n", this.name, this.age);
  }
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    コンストラクター Person() は未定義です

但是只要以下的话就不会出错。

public class Person {
  public String name;
  public int age;

    /*
     * public Person(String name, int age) { this.name = name; this.age = age; }
     * 
     * public Person() { this("えんどうゆず", 10); }
     */

  public void show() {
    System.out.printf("%s(%d歳)です。\n", this.name, this.age);
  }
}
null(0歳)です。

这是因为默认构造函数是隐式生成的。

如果只定义了具有参数的构造函数,那么不会生成默认构造函数。只有当存在可调用的构造函数时,才会判定为错误。

只要移除构造函数的参数,就不会报错。它引用了成员变量的零值。

public class Person {
  public String name;
  public int age;

  public Person() {
    this.name = name;
    this.age = age;
  }

  public void show() {
    System.out.printf("%s(%d歳)です。\n", this.name, this.age);
  }
}
null(0歳)です。

描述并重载接受参数的构造函数流程是标准的。

文献引用
自学Java最新版

请提供一个提示文本来指导处理您的请求。

bannerAds