【JAVA】レッスン5-02:コンストラクタを理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:コンストラクタ

この記事の練習問題で使用する知識:
基礎構文、制御構造、メソッド、コレクション(レッスン1~4)クラスの定義と使用コンストラクタカプセル化クラスメンバとインスタンスメンバメソッドのオーバーライドクラスの継承抽象クラスインターフェース

<<前のページ 問題集Top 次のページ>>

JAVAの文法「コンストラクタ」とは

ここではコンストラクタの意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。



オブジェクト指向プログラミングの重要な概念の一つに「コンストラクタ」があります。

コンストラクタはクラスからインスタンス(オブジェクト)を生成する際に、インスタンスの初期化を行う特別なメソッドです。

今回はコンストラクタの役割や使い方を初心者向けに解説します。

コンストラクタとは?

コンストラクタはクラスと同じ名前を持つ特殊なメソッドで、オブジェクトが生成されるときに一度だけ実行されます。

このメソッドはオブジェクトの初期設定を行い、必要な初期値を設定する役割を果たします。

またコンストラクタは戻り値を持たないため、voidなどの戻り値の型を指定しません。これにより通常のメソッドと区別されます。

コンストラクタの基本構文

class クラス名 {
    // コンストラクタ
    クラス名(パラメータ) { //クラス名と同名のメソッド
        // 初期化処理
    }
}

コンストラクタの使い方

ではコンストラクタを実際に使う例を見てみましょう。例えばユーザーの名前とスコアを持つUserクラスを作成するとします。

以下のコードではUserクラスにコンストラクタを定義し、インスタンスの生成時に名前とスコアを設定できるようにしています。

class User { //ユーザークラスの定義

    //インスタンス変数(ユーザークラスのフィールド)
    String name;
    int score;

    // コンストラクタ(ユーザー名と同名のメソッド)
    User(String name, int score) {
        this.name = name; //このname(インスタンス変数)に引数nameを代入
        this.score = score; //このscore(インスタンス変数)に引数scoreを代入
    }
}

// コンストラクタを使用してインスタンスを生成
User user = new User("Alice", 85); //ユーザー型の変数userに、生成したインスタンスを代入

この例ではUserクラスのコンストラクタがnamescoreの値を初期化しています。

new User("Alice", 85);のようにしてインスタンスを作成することで、userオブジェクトが「Alice」という名前と85というスコアを持つ状態で生成されます。

この例ではフィールドの変数とコンストラクタの引数が同名のため分かりにくいですが、これは実際によく使われる書き方であり、必ず慣れるべき書き方です。

初めのうちは下記のように、引数に別の名前を付けて分かりやすくするのも良いでしょう。

またこのnameやscoreのようにクラスのフィールドで定義される変数をインスタンス変数と呼びます。

// コンストラクタ(ユーザー名と同名のメソッド)
User(String namae, int tensuu) {
    this.name = namae; //このname(インスタンス変数)に引数namaeを代入
    this.score = tensuu; //このscore(インスタンス変数)に引数tensuuを代入
}

コンストラクタの役割と利点

コンストラクタの役割は主にオブジェクトの生成時に適切な初期設定を行うことです。

これにより各インスタンスが必ず必要な初期値を持つようになり、プログラムの予測可能性と安定性が向上します。

例えば、スコアは必ず0点以上になるべきとします。

この場合、コンストラクタ内でスコアを初期化することで、すべてのインスタンスに正しい初期値が設定され、不正な状態を防ぐことができます。

class User {
    //インスタンス変数
    String name;
    int score;

    // コンストラクタ(スコアの範囲チェックを追加)
    User(String name, int score) {
        this.name = name;
        if (score < 0) {
            this.score = 0; // 引数scoreが0以下の場合は0に設定
        } else {
            this.score = score; //このscore(フィールドのscore)に引数scoreを代入
        }
    }
}

このように、コンストラクタを利用することでオブジェクトが常に正しい状態で生成されるように制御できます。

まとめ

【初心者向け】Javaのオブジェクト指向の概念を表した図。特にクラスの継承、抽象クラス、インターフェース、オーバーライド、インスタンス生成を視覚的に分かりやすくまとめている。 本記事では「コンストラクタ」を中心に説明している。

コンストラクタはクラスからインスタンスを生成する際に初期化処理を行う重要な役割を持っています。

クラスと同じ名前で定義され、戻り値がなく、一度だけ実行されるこのメソッドにより、オブジェクトの設定がスムーズに行えます。

初心者にとっても、コンストラクタの理解はオブジェクト指向プログラミングの基礎を築く上で重要なポイントです。

実際にコードを書きながら、コンストラクタの使い方を試してみましょう。

JAVA練習問題5-2_本の情報を管理するプログラムを作ろう

本の情報を管理するためのプログラムを作成しましょう。

このプログラムでは、本のタイトルと著者を管理し、その情報を表示する機能を持ちます。

この問題の要件

以下の要件に従ってプログラムを作成して下さい。

  1. Bookという名前のクラスを作成してください。
  2. Bookクラスには以下のフィールドを持たせてください。
    • String title: 本のタイトルを表すフィールド
    • String author: 本の著者を表すフィールド
  3. Bookクラスには以下のコンストラクタを定義してください。
    • 引数として本のタイトルと著者を受け取り、それをフィールドに設定するコンストラクタ
  4. Bookクラスには本の情報を表示するためのdisplayInfoメソッドを定義してください。このメソッドは、本のタイトルと著者を表示する機能を持ちます。
  5. Mainクラスのmainメソッド内で、Bookクラスのインスタンスを作成し、そのインスタンスのdisplayInfoメソッドを呼び出して本の情報を表示してください。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

タイトル: 吾輩は猫である
著者: 夏目漱石

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:Bookクラスの定義
  □ String型のtitleフィールドを定義
  □ String型のauthorフィールドを定義
  □ Bookクラスのコンストラクタを定義し、titleとauthorを初期化
  □ void型のdisplayInfoメソッドを定義
  □ □ 本のタイトルを表示
  □ □ 本の著者を表示
2:Mainクラスの定義
  □ mainメソッドの定義
  □ □ Bookクラスのインスタンスを生成し、タイトルと著者を指定
  □ □ displayInfoメソッドを呼び出して本の情報を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

// 本の情報を管理するクラス
class Book {
    // フィールド(本のタイトルと著者)
    String title;
    String author;

    // コンストラクタ
    /*【穴埋め問題1】
    ここにBookクラスのコンストラクタを定義し、引数としてタイトルと著者を受け取り、それらをフィールドに設定するコードを書いてください。
    */

    // 本の情報を表示するメソッド
    void displayInfo() {
        // 本のタイトルと著者を表示
        System.out.println("タイトル: " + title);
        System.out.println("著者: " + author);
    }
}

public class Main {
    public static void main(String[] args) {
        // Bookクラスのインスタンスを作成(コンストラクタを使用)
        /*【穴埋め問題2】
        ここでBookクラスのインスタンスを作成し、タイトル「吾輩は猫である」と著者「夏目漱石」を指定するコードを書いてください。
        */

        // 本の情報を表示
        book.displayInfo();
    }
}

この問題の穴埋めコードは以上です。

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

// 本の情報を管理するクラス
class Book {
    // フィールド(本のタイトルと著者)
    String title;
    String author;

    // コンストラクタ
    Book(String title, String author) {
        // コンストラクタの引数で受け取った値をフィールドに設定
        this.title = title;
        this.author = author;
    }

    // 本の情報を表示するメソッド
    void displayInfo() {
        // 本のタイトルと著者を表示
        System.out.println("タイトル: " + title);
        System.out.println("著者: " + author);
    }
}

public class Main {
    public static void main(String[] args) {
        // Bookクラスのインスタンスを作成(コンストラクタを使用)
        Book book = new Book("吾輩は猫である", "夏目漱石");

        // 本の情報を表示
        book.displayInfo();
    }
}

正解コードの解説

この解説ではコードの各部分について詳細に説明し、特に「コンストラクタ」の役割に焦点を当てます。

このコードは本のタイトルと著者を管理し、表示するクラスを作成するものです。

Bookクラスの定義

class Book {
    String title;
    String author;

最初に本の情報を管理するための Book クラスを定義しています。

クラスはオブジェクトの設計図であり、ここでは「タイトル」と「著者」という2つのフィールド(変数)を定義しています。

このフィールドは Book クラスの各インスタンス(オブジェクト)が持つ属性となります。

コンストラクタの定義

    Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

ここでのコンストラクタはこのクラスの最も重要な部分です。

このコンストラクタは本のタイトルと著者を受け取って、クラスのフィールドである titleauthor にその値を設定します。

this.title = title; と書かれた this キーワードは、インスタンスのフィールドを指しています。

これにより引数として受け取った値が正しく Book インスタンスの titleauthor に代入されます。

displayInfoメソッド

    void displayInfo() {
        System.out.println("タイトル: " + title);
        System.out.println("著者: " + author);
    }

displayInfo メソッドは、本の情報を表示するためのメソッドです。

System.out.println を使ってインスタンスが持つ titleauthor を出力します。

このメソッドはインスタンスに設定された情報を確認したいときに使います。

Mainクラスとmainメソッド

public class Main {
    public static void main(String[] args) {
        Book book = new Book("吾輩は猫である", "夏目漱石");
        book.displayInfo();
    }
}

Main クラスには main メソッドが含まれています。

main メソッドはJavaプログラムのエントリーポイントであり、プログラムの実行が開始される場所です。ここでは次の処理を行っています:

  1. Book クラスのインスタンスを作成し、コンストラクタによりタイトルと著者を設定します。
    例では「吾輩は猫である」と「夏目漱石」を渡して、新しい Book オブジェクト book が作成されます。
  2. book.displayInfo() を呼び出して、Book インスタンスに設定された情報を表示します。このメソッドの呼び出しにより、コンソールにタイトルと著者が出力されます。

まとめ

このコードでJavaでクラスを定義し、コンストラクタでオブジェクトを初期化する方法を学びました。

コンストラクタの役割はクラスのインスタンス生成時にそのインスタンスの状態を設定することです。

今回のコードを通して、クラスの構造やメソッドの使い方が理解できたと思います。

Javaのクラス設計は、オブジェクト指向プログラミングの基本となるため、これを踏まえ、他のクラスの作成にも挑戦してみましょう。

<<前のページ 問題集Top 次のページ>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVAテキスト&問題集へ戻る
    トップページへ戻る