👩🏼‍🏫

【Java】コンストラクタ

2022/02/11に公開

はじめに

Java Silverの受験にあたって、勉強したことをまとめました。
著作権侵害にならないように気をつけていますが、問題があれば教えてください🙇🏻‍♀️

コンストラクタとは

  • インスタンス化(new)された直後に自動で実行される処理のこと

コンストラクタの条件

  1. メソッド名がクラス名と同じ
  2. メソッド宣言に戻り値が記述されていない(voidもダメ!)

コンストラクタの定義

  • コンストラクタの条件に従って定義する
public class クラス名 {
    アクセス修飾子 コンストラクタ名(引数) {
        自動的に実行する処理
    } // コンストラクタ名はクラス名と同じにすること!
}

実際に定義すると

Hero.java
public class Hero {
    String name;
    int hp;

    // コンストラクタ
    public Hero(String name) {
        System.out.println("新たなヒーローが誕生した!");
        this.hp = 100;
        this.name = name;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Hero h1 = new Hero("akari");

        System.out.println("名前は" + h1.name);
        System.out.println("HPは" + h1.hp);
    }
}
// 実行結果
新たなヒーローが誕生した!
名前はakari
HP100

コンストラクタのオーバーロード

  • 同じ名前で引数が異なるメソッドを複数定義できる
  • これを オーバーロード(多重定義) という
Hero.java
public class Hero {
    String name;
    int hp;

    // ①引数ありのコンストラクタ
    public Hero(String name) {
        System.out.println("新たなヒーローが誕生した!");
        this.hp = 100;
        this.name = name;
    }

    // ②引数なしのコンストラクタ
    public Hero() {
        System.out.println("新たなヒーローが誕生した!");
        this.hp = 100;
        this.name = "test";
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Hero h2 = new Hero(); // 今度は引数なし
        System.out.println("名前は" + h2.name);
        System.out.println("HPは" + h2.hp);
    }
}
// 実行結果
新たなヒーローが誕生した!
名前はtest
HP100

同じクラスの別コンストラクタを呼び出す

  • コンストラクタを直接呼び出すことはできない
  • this を使って、JVM(Java仮想マシン)にコンストラクタの起動を依頼する
this(引数);

thisは最初に記述する

Test.java
public class Test {

    public Test() {
        System.out.println("A"); // コンパイルエラー
        this("B");
    }

    public Test(String str) {
        System.out.println(str);
    }
}

正しく使うとこんな感じ

Wizard.java
public class Wizard {
    String name;
    int hp;
    int mp;

    // 引数3つのコンストラクタ
    public Wizard(String name, int hp, int mp) {
        System.out.println("新たな魔法使いが誕生した!");
        this.name = name;
        this.hp = hp;
        this.mp = mp;
    }

    // 引数1つのコンストラクタ
    public Wizard(String name) {
        // 引数3つのコンストラクタの呼び出しを依頼
        // HPとMPは決まった値で初期化する
        this(name, 100, 5);
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        // 引数3つの場合
        Wizard w1 = new Wizard("kana", 80, 10);
        System.out.println("名前は" + w1.name);
        System.out.println("HPは" + w1.hp);
        System.out.println("MPは" + w1.mp);
        // 引数1つの場合
        Wizard w2 = new Wizard("shiori");
        System.out.println("名前は" + w2.name);
        System.out.println("HPは" + w2.hp);
        System.out.println("MPは" + w2.mp);
    }
}
// 実行結果

// 引数3つの場合
新たな魔法使いが誕生した!
名前はkana
HP80
MP10
// 引数1つの場合
新たな魔法使いが誕生した!
名前はshiori
HP100
MP5

デフォルトコンストラクタ

  • クラスにコンストラクタが1つも定義されていない場合、引数なし・処理内容なしのコンストラクタが、コンパイル時に自動で追加される
  • 引数なし・処理内容なしのコンストラクタをデフォルトコンストラクタという

まとめ

  • コンストラクタとは、インスタンス化(new)された直後に自動で実行される処理のこと
  • コンストラクタの条件は、
    ①メソッド名がクラス名と同じ
    ②メソッド宣言に戻り値が記述されていない(voidもダメ!)
  • コンストラクタは オーバーロード(多重定義) できる
  • デフォルトコンストラクタとは、クラスにコンストラクタが1つも定義されていない場合に自動で追加される「引数なし・処理内容なし」のコンストラクタのこと
  • 同じクラスの別コンストラクタを呼び出すときはthis(引数);
  • thisよりも先に他の処理を記述すると、コンパイルエラー

こんな感じかな!
次は継承について書きます!

参考

このあたりは本当に、「スッキリわかるJava入門」がわかりやすかったです!
ぜひ読んでみてください!
こちらのサイトで紙版を買うと、電子版が半額になるのでオススメですー🌟
https://honto.jp/netstore/pd-book_29951463.html

Discussion