' P '

whatever I will forget

Java コンストラクタ

Javaにもコンストラクタがあるのか。。って思ってたら
Javaにはデフォルトコンストラクタなるものがらしい。

デフォルトコンストラク

下記を参考にさせていただいた

www.javadrive.jp

引用すると

コンストラクタを1つも定義していない場合、自動的にデフォルトコンストラクタと呼ばれるコンストラクタが作成されます。

クラス名(){
}

見て頂くと分かりますが、引数無しで中身が空のコンストラクタが作成されます。中身が空ですので何もしません。

ふーむ何もしないのか。
しかし、同じく注意書きがあった点。

引数無しのコンストラクタを記述したのであれば問題無いのですが、引数無しのコンストラクタを定義せず、
引数があるコンストラクタだけ記述した場合にもデフォルトのコンストラクタは作成されないため、
引数無しでそのクラスのオブジェクトを作成する事が出来なくなりますので注意して下さい。

ほーなるほど。
コンストラクタを作成するのであれば引数無し版は必ず作っておいたほうがいいっぽい、、?

サンプルコード

get_set.java

public class get_set {
    public static void main(String[] args) {
        Human a1 = new Human();
        System.out.println(a1.getName());
        Human a2 = new Human("manko");
        System.out.println(a2.getName());
        a2.setName("chinko");
        System.out.println(a2.getName());
    }
}

Human.java

public class Human {
    private String name;
    Human() {
        name = "unko";
    }
    Human(String s) {
        name = s;
    }
    // Getter
    public String getName() {
        return name;
    }
    // Setter
    public void setName(String s) {
        this.name = s;
    }
}
unko
manko
chinko

javaって#includeみたいなの無くてもコンパイル通るんですね。。どうなってんの?

3/11/2020 追記

引数無しのコンストラクタを作成した場合、そのコンストラクタから定義済みコンストラクタを呼ぶことができるらしい!
たとえば上記のHumanクラスだと下記みたいにthisを使う。
こーすることでString型の引数を持つコンストラクタに引数なしコンストラクタからcallすることができる!(興奮気味)
なので、下記のsoutのdisplay順番は、Constructor 2 is called -> Constructor 1 is calledとなる。

public class Human {
    private String name;
    Human() {
        this("unko");
        System.out.println("constructor 1 is called")
    }
    Human(String s) {
        name = s;
        System.out.println("constructor 2 is called")
    }
// omitted