未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の基本問題2-5

title


問題2-5

四角形を表すSquareクラスを作成してください。

Squareクラスを使用するConstructorBasicPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)


【Squareクラス】

  1. 幅widthと高さheight(どちらもdouble型)の2つのインスタンスフィールドを持ちます。

  2. 幅と高さの初期値を引数として受け取るコンストラクタが存在します。受け取った初期値をそのまま各フィールドにセットしてください。

  3. 幅と高さに関する情報を出力するinformメソッド(引数なし・戻り値なし)が存在します。出力内容は、実行結果を参考にしてください。

  4. 面積を算出するgetAreaメソッド(引数なし・戻り値double型)が存在します。

  5. 幅の値を引数で受け取った増分だけ増加するaddWidthメソッド(引数double型・戻り値なし)が存在します。


【実行結果】

この四角形の幅は4.5、高さは2.8です。
この四角形の面積は12.6です。

この四角形の幅は7.5、高さは2.8です。
この四角形の面積は21.0です。


【ConstructorBasicPractice.java】

public class ConstructorBasicPractice {
    public static void main(String[] args) {

        // Squareクラスのオブジェクトを作成
        Square square = new Square(4.5, 2.8);

        // 四角形の情報を出力
        square.inform();

        // 面積の表示
        System.out.println("この四角形の面積は" + square.getArea() + "です。");

        // 幅を3.0増加させる
        square.addWidth(3.0);

        System.out.println();

        // 四角形の情報を出力
        square.inform();

        // 面積の表示
        System.out.println("この四角形の面積は" + square.getArea() + "です。");

    }
}


// ここにSquareクラスを作成してください。


解答例

【ConstructorBasicPractice.java】

public class ConstructorBasicPractice {
    public static void main(String[] args) {

        // Squareクラスのオブジェクトを作成
        Square square = new Square(4.5, 2.8);

        // 四角形の情報を出力
        square.inform();

        // 面積の表示
        System.out.println("この四角形の面積は" + square.getArea() + "です。");

        // 幅を3.0増加させる
        square.addWidth(3.0);

        System.out.println();

        // 四角形の情報を出力
        square.inform();

        // 面積の表示
        System.out.println("この四角形の面積は" + square.getArea() + "です。");

    }
}

// 四角形Squareクラス
class Square{

    // 幅
    private double width;

    // 高さ
    private double height;

    // コンストラクタ
    public Square(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 情報出力メソッド
    public void inform() {
        System.out.println("この四角形の幅は" + width + "、高さは" +
                    height + "です。");
    }

    // 面積算出メソッド
    public double getArea() {
        return width * height;
    }

    // 幅増加メソッド
    public void addWidth(double delta) {
        width += delta;
    }
}


解説

今回の問題のテーマは「コンストラクタ」です。

オブジェクト指向的には、超重要事項なので、しっかりと理解しておきましょう。



「コンストラクタ」とは、簡単に言えば「特殊なメソッド」です。

どのように特殊かというと、クラスがインスタンス化される時にだけ呼び出されるという特徴があります。


もっと簡単に言うとnewキーワードの後にだけコンストラクタの呼び出しを記述できます



クラスをインスタンス化するときに、あらかじめ値を設定する必要のあるフィールドを初期化する目的でよく使用されます。



コンストラクタの超重要なポイントは次の2つです。

  1. コンストラクタ名はクラス名と必ず同じにする必要がある

  2. コンストラクタには戻り値の型(void)を記述しない



通常のメソッドの命名ルールは先頭が小文字ですが、クラス名の命名ルールは先頭が大文字なので、コンストラクタも当然大文字始まりになります。



コンストラクタの定義で一番よくあるミスは、次のようなものです。

// コンストラクタ(これは誤り)
public void Square(double width, double height) {
    this.width = width;
    this.height = height;
}


コンストラクタは戻り値の型「void」を書いてはダメです。

つまり「void」を書いてしまうと、それはコンストラクタではなく、ただの「おかしな名前のメソッド」となってしまいます。


運が良ければコンパイルエラー(今回の問題はそのパターン)ですが、運が悪いとコンパイルが通ってしまい、致命的なバグを混入させることになります。



また、クラスを定義してコンストラクタを特に記述しない場合、自動的に「引数なしのコンストラクタ」が挿入されるという仕組みがあります。

これを「デフォルトコンストラクタ」と言います。


しかし、プログラマが明示的にコンストラクタを定義すると「デフォルトコンストラクタ」は消えてなくなります。


このコンストラクタに関する動きも、しっかり理解しておきましょう。


参考図書



LINE公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加