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

ながみえ

一つ前のページではクラスの基本について学習しました。

今回は コンストラクタ について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス

 ・Lesson5-1:クラスの基本を確認しよう
 ・Lesson5-2:コンストラクタを理解しよう ◁今回はココ
 ・Lesson5-3:カプセル化を理解しよう
 ・Lesson5-4:クラスメンバとインスタンスメンバを理解しよう
 ・Lesson5-5:クラスの継承を理解しよう
 ・Lesson5-6:メソッドのオーバーライドを理解しよう
 ・Lesson5-7:抽象クラスを理解しよう
 ・Lesson5-8:インターフェースを理解しよう
 ・確認問題5-☆1:モンスター捕獲ゲームを作ろう
 ・確認問題5-☆2:モンスターとのバトルゲームを作ろう
 ・確認問題5-☆3:マルバツゲーム(Tic-Tac-Toe)を作成しよう

<<前のページ

学習記事一覧

次のページ>>

コンストラクタ入門|役割・構文・使い方をわかりやすく解説

Javaでクラスからオブジェクトを生成するとき、そのオブジェクトの初期状態を設定する役割を持つのがコンストラクタです。

コンストラクタを正しく理解すれば、生成と同時に必要な値を設定したり、初期化処理を自動化したりすることができます。

本記事では、コンストラクタの基本的な仕組みや書き方、thisキーワードの活用方法、実用的なコード例までを初心者向けにわかりやすく解説します。

これを学べば、オブジェクト生成のたびに繰り返し書いていた初期設定を効率化し、よりスマートなコードが書けるようになるでしょう。

それでは、コンストラクタの世界を一緒に探っていきましょう。

コンストラクタとは?|オブジェクト初期化の仕組みと書き方

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

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

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

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

コンストラクタのコード例とインスタンス生成の手順

前回の記事でも紹介したユーザーの名前と年齢を持つUserクラスを使い、コンストラクタを実装する例を見てみましょう。

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

class User {	 // Userクラスの定義

    // Userクラスのフィールド
    String name; // 空の変数nameを宣言
    int age;	 // 空の変数ageを宣言

    // コンストラクタ(クラス名と同名のメソッド)
    User(String name, int age) { // 2つの引数を持つコンストラクタの定義
        this.name = name;		 // "このname(フィールドの変数)"に引数nameを代入
        this.age = age;			 // "このage(フィールドの変数)"に引数ageを代入
    }
}

public class Main {
    public static void main(String[] args) {
		// インスタンス生成と初期化
		User user = new User("Alice", 20);	// Userクラスのインスタンスを生成し、User型の変数userに代入
    }
}

この例では、Userクラスをインスタンス生成する際に2つの引数を渡すことでコンストラクタが動作し、フィールドの変数nameageに値が代入されます(初期化)。

すなわち生成されたuserオブジェクトの中の2つの変数には既に値が格納されており、そのまま使用することができます。

注意点

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

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

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

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

例えば1つのクラスから複数のインスタンスを生成する際には、それぞれの変数を呼び出して代入する手間が省けます。

public class Main {
    public static void main(String[] args) {
		User user_1 = new User("太郎", 30);
      	User user_2 = new User("二郎", 25);
      	User user_3 = new User("三郎", 20);
    }
}

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

まとめ|効率的なオブジェクト初期化の基礎

今回の学習では、コンストラクタの役割や基本構文、実際の記述例とインスタンス生成の流れについて学びました。

これにより、オブジェクトを生成すると同時に必要な初期化処理を行い、効率的で可読性の高いコードを書けるようになります。

コンストラクタの活用は、クラス設計の品質やメンテナンス性を大きく向上させる重要な技術です。

ここで身につけた基礎を活かし、さらに実用的で拡張性のあるプログラム作りに挑戦していきましょう。

練習問題|Bookクラスで本のタイトルと著者を管理するプログラムを作成しよう

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

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

この問題の要件

以下の要件に従ってコードを完成させてください。

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

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

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

この問題を解くヒント

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

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

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

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

Q
ヒント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();
    }
}

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

練習問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// 本の情報を管理するクラス
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();
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

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学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました