0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Java】コンストラクターについて

Posted at

簡単にまとめました。

コンストラクターとは

  • インスタンス化のタイミングで呼び出される特殊なメソッド
  • コンストラクターではメンバー変数の初期化など、事前処理系を記述するのが一般的

とりあえず、以下サンプルコードを実行します。

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 新版

https://www.shoeisha.co.jp/book/detail/9784798151120

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?