見出し画像

Javaのコンストラクタとインスタンス

Javaのコンストラクタとインスタンスを書いてみます。

//メインクラス
public class Main{
    public static void main(String[] args) {

        //インスタンス生成
        Student pushiyomi = new Student("Pushiyomi", 23);
        //インスタンスのメソッドにアクセス
        pushiyomi.greeting();

    }
}

//新しいクラス
class Student {

    //フィールド
    static int num=0;

    String name;
    int age;

    //コンストラクタ
    Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.num += 1;
    }

    //メソッド
    void greeting() {
        System.out.println("Hello, my name is " + this.name);
        System.out.println("I am " + this.age + " years old");
    }

}

実行結果は、

Hello, my name is Pushiyomi
I am 23 years old

となりました。

順を追って説明します。

1. メインクラスとは

メインクラスはpublic static void main(String[] args)が存在しているクラスを指します。上の例ではMainクラスがメインクラスになります。

2. 新しいクラスとは

新しいクラスが今回の勉強テーマでとても大切になります。

このクラスにフィールドやメソッド、コンストラクタを記述していきます。

3. フィールドとは

あるクラスに存在する変数すべてを指します。

4. メソッドとは

あるクラスに存在する関数すべてを指します。

5. コンストラクタとは

新しいクラス内に書くインスタンスを生成するためのものです。

コンストラクタは引数と書くことができます。インスタンスを生成する際に引数を受け取ることで、その引数情報をそれぞれのインスタンスに保存できます。

6. インスタンスとは

自クラスか他クラスからコンストラクタを介して作ります。

上の例では、Pushiyomiという名前の学生をインスタンスとして作成しました。そのインスタンスはStudentクラスのフィールドとメソッドすべてにアクセスできます。つまり、名前と年齢を格納してgreetingメソッドから挨拶をすることが出来ます。

Pushiyomiくん以外にharutaというインスタンスを生成することもできます。そのインスタンスないのフィールド名前と年齢はharutaくん用の情報として保持することができます。つまりpushiyomiくん用とharutaくん用のインスタンスを生成できます。


インスタンスを増やす

mainメソッド内に追加の記述をしました。

//メインクラス
public class Main{
    public static void main(String[] args) {

        //インスタンス生成
        Student pushiyomi = new Student("Pushiyomi", 23);
        //インスタンスのメソッドにアクセス
        pushiyomi.greeting();
        //インスタンス生成2
        Student haruta = new Student("Haruta", 13);
        //インスタンスのメソッドにアクセス
        haruta.greeting();

    }
}

//新しいクラス
class Student {

    //フィールド
    static int num=0;

    String name;
    int age;

    //コンストラクタ
    Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.num += 1;
    }

    //メソッド
    void greeting() {
        System.out.println("Hello, my name is " + this.name);
        System.out.println("I am " + this.age + " years old");
    }

}

実行結果は、

Hello, my name is Pushiyomi
I am 23 years old
Hello, my name is Haruta
I am 13 years old

となりました。

注目してほしいのは、メインメソッド内のgreeting()に引数を渡していないのにそれぞれ異なる出力がされているところです。

ここを見るとそれぞれのインスタンスにそれぞれ異なる情報が保存されていることがわかります。


一般化

インスタンス生成の仕方

ここでクラス名とコンストラクタ名は同じにする必要があります。

インスタンス名は任意に指定できます。

クラス名 インスタンス名 = new コンストラクタ名(引数);


コンストラクタの書き方

コンストラクタは新しいクラスの中に書きます。

クラス名とコンストラクタ名は同じにする必要があります。

引数を渡さない、処理を何も書かないコンストラクタは書かなくても初めから用意されています。コンストラクタは、引数を利用してインスタンスに情報を付与したい時や何個インスタンスを作成したかクラス変数に保存したい時などに書きましょう。

クラス名 {
    フィールド1;
    フィールド2;

    コンストラクタ名(引数) {
        //処理
    }

    メソッド1;
    メソッド2;
}


まとめと考察

しょうじき初めのうちは誰もコンストラクタやインスタンスを理解できません。

しばらく色々なアルゴリズムなどを書いたりしてもう書き飽きたくらいになって勉強すればわかるようになるはずです。


インスタンスのメソッドにアクセスする時にpushiyomi.greeting()と書いてあります。.(ドット)を挟むことでインスタンスのメソッドやフィールドにアクセスすることができます。

これはnew java.util.Scanner(System.in).nextInt();を理解する一歩に繋がります。これを理解するにはもう一つパッケージという概念を理解する必要があります。


実はもう一つ、今回はstaticを付けたクラス変数を用意してあります。

これは生徒が何人、インスタンが何個作られたかを把握するために用意しました。コンストラクタの中にnum += 1;という文が書いてあるはずです。

このnumというint型変数は新しいクラスStudentのフィールドとして定義しておきました。そしてそれの前にstaticと書いてあると思います。

クラス変数はどのインスタンスから参照しても同じ値を取ります。つまり生徒の人数を知りたい時に

System.out.println(haruta.num);
System.out.println(pushiyomi.num);

は同じ出力になります。


この記事が気に入ったらサポートをしてみませんか?