栗悟飯とカメハメ波

秋葉系ニートブログ。

【Javaメモ】コンストラクタとそのオーバーロードについて

こんちゃ、Roaでし。

今回はコンストラクタとそのオーバーロードについて書いていきます。
ざっと説明を。



では簡単に定義を書いたところで実際のコードを書いていきます。


Main.java

public class Main { 
    public static void main(String[] args) { 
        Unko u= new Unko("うんこ",1000);
        System.out.println(u.name);
        System.out.println(u.hp); 
    }
}

Unko.java

public class Unko {
    String name;
    int hp;
    
    public Unko(String name,int hp) {  //コンストラクタ
        this.hp=hp;
        this.name=name;
    }
}

これでうんこがnew、つまりインスタンス化したときにUnko.javaのコンストラクタが働きます。
今回はコンストラクタの引数が2つ設定されているのでインスタンスを育成するMain上で2つ値を渡す必要があります。


ではこれをオーバーロードしてみましょう。

Main.java

public class Main {
    public static void main(String[] args) {
        Unko u= new Unko("うんこ");
        System.out.println(u.name);
        System.out.println(u.hp);
    }
}

変更点はインスタンス化したときに渡す値が今回は一つとなっています。

Unko.java

public class Unko {
    String name;
    int hp;

    public Unko(String name,int hp) {
        this.hp=hp;
        this.name=name;
    }
    public Unko(String name) {
        this.hp=100;
        this.name=name;
    }
}

コンストラクタが増えてるのが分かると思います。
これでコンパイラがどちらのコンストラクタを使うのが適切かを判断して勝手に正しい方を当てはめてくれます。
今回は引数の数が違うという違いですが、文字列や数字も判別してくれます。


ちなみにコンストラクタをコンストラクタで呼び出したいときは以下のようにします。
ここでは前に書いたpublic Unko(String name)から始まるものを呼び出します。

public Unko() {
        this("ぱありいぴいぽう");
    }

ここでいうthisは同一クラスの別コンストラクタを表すものです。
自分自身のインスタンスを表すものとは別物です。

なお、この時名前だけしかthisで書いていないため、String nameしか受け取れないように設定しているほうのコンストラクタが呼び出されることになります。


分かりやすくこれまでの一連の流れを貼っておきます。

Main.java

public class Main {
    public static void main(String[] args) {
        Unko u= new Unko("うんこ");
        System.out.println(u.name+u.hp);
        Unko n= new Unko();
        System.out.println(n.name);
    }
}

Unko.java

public class Unko {
    String name;
    int hp;

    public Unko(String name,int hp) {
        this.hp=hp;
        this.name=name;
    }
    public Unko(String name) {
        this.hp=100;
        this.name=name;
    }
    public Unko() {
        this("ぱありいぴいぽう");
    }
}


今回はここらへんで。ではでは。