Javaプログラミング練習問題(Objectクラス)

Java

こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。

Javaプログラミング向け練習問題、オブジェクト指向編。今回のテーマはObjectクラスです。Objectクラスは「すべてのクラスのスーパークラス」に位置づけられる大変重要なクラスです。そんなObjectクラスの中で特に使用頻度の高いequalsメソッドtoStringメソッドを活用した練習問題をご用意しました。ぜひ、学習にお役立てください。

練習問題の一覧(※随時追加)は、こちらのリンクよりご確認頂けます。

問題編

Q001

下記の仕様に基づいて、Itemクラスのequalsメソッドをオーバーライドしてください。提供コードのItem.javaとMain.javaを同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

仕様

  • equalsメソッド
    • 引数:
      • obj:Object型
    • 戻り値: boolean型
    • 処理内容
      • 引数objがItemインスタンスでない場合はfalseを返す。
      • 引数objがItemインスタンスであり、メンバ変数name,priceの2つとも自身のインスタンスと同じ値である場合、trueを返す。
        ※ただし、いずれかのnameがnullの場合はfalseを返す。

提供コード

(Item.java)

public class Item {
    public String name;
    public int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    //ここにequalsメソッドを追加する

}

(Main.java)

public class Main{
    public static void main(String[] args){
        Item i1 = new Item("りんご",150);
        Item i2 = new Item("りんご",150);
        Item i3 = new Item("りんご",200);
        Item i4 = new Item("みかん",100);
        
        System.out.println(i1.equals(i2));
        System.out.println(i1.equals(i3));
        System.out.println(i1.equals(i4));
        System.out.println(i1.equals(null));
    }
}

実行結果

true
false
false
false

Q002

下記の仕様に基づいて、ItemクラスのtoStringメソッドをオーバーライドしてください。提供コードのItem.javaとMain.javaを同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

仕様

  • toStringメソッド
    • 引数:なし
    • 戻り値: String型
    • 処理内容
      • 次の文字列を戻り値として返します。
        商品名:XXXX 価格:YYY
        ※XXXX、YYYYはそれぞれメンバ変数nameとpriceの値を表す

提供コード

(Item.java)

public class Item {
    public String name;
    public int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    //ここにtoStringメソッドを追加する

}

(Main.java)

public class Main {
    public static void main(String[] args) {
        Item item1 = new Item("りんご",100);
        Item item2 = new Item("みかん",200);

        System.out.println(item1);
        System.out.println(item2);
    }
}

実行結果

商品名:りんご 価格:100
商品名:みかん 価格:200

Q003

下記の仕様に基づいて、TriangleクラスのtoStringメソッドとequalsメソッドをオーバーライドしてください。提供コードのTriangle.javaとMain.javaを同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。

仕様

  • Triangleクラス
    三角形を表すクラスです。メンバ変数として底辺(bottom)と高さ(height)の2つを持ちます。三角形の面積は「底辺×高さ÷2」で表すものとします。

    • toStringメソッド
      • 引数:なし
      • 戻り値: String型
      • 処理内容
        • 次の文字列を戻り値として返します。
          底辺:XX 高さ:YY 面積:ZZ
          ※XXXX、YYYYはそれぞれメンバ変数bottomとheightの値を表す
          ※ZZは三角形の面積を表す
    • equalsメソッド
      • 引数:
        • obj:Object型
      • 戻り値: boolean型
      • 処理内容
        • 引数objがTriangleインスタンスでない場合はfalseを返す。
        • 引数objがTriangleインスタンスであり、メンバ変数bottom,heightの2つとも、自身のインスタンスと同じ値である場合trueを返す。

提供コード

(Triangle.java)

public class Triangle {
    public int bottom;      //底辺
    public int height;      //高さ

    public Triangle(int bottom, int height) {
        this.bottom = bottom;
        this.height = height;
    }

    //ここにtoStringメソッドを追加する

    //ここにequalsメソッドを追加する

}

(Main.java)

public class Main {
    public static void main(String[] args) {
        Triangle tri1 = new Triangle(10,5);
        Triangle tri2 = new Triangle(10,5);
        Triangle tri3 = new Triangle(8,5);
        Triangle tri4 = new Triangle(10,7);

        System.out.println(tri1.equals(tri2));
        System.out.println(tri1.equals(tri3));
        System.out.println(tri1.equals(tri4));
        System.out.println(tri1.equals("Triangle"));

        System.out.println(tri1);
        System.out.println(tri3);
    }
}

実行結果

true
false
false
false
底辺:10 高さ:5 面積:25
底辺:8 高さ:5 面積:20

解答編

それでは解答編です。適宜コメントを使って、プログラムの説明を行っています。

Q001

(Item.java)

public class Item {
    public String name;
    public int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public boolean equals(Object obj) {
        //引数objがnullの場合はfalseを返す
        if( obj == null ) {
            return false;
        }
        //引数objがItem型のインスタンスかどうかをチェック
        if( obj instanceof Item ) {
            //Item型に変換
            Item item = (Item)obj;
            //2つのインスタンスのいずれかのnameがnullならfalseを返す
            if( item.name == null || this.name == null ) {
                return false;
            }
            //2つのインスタンスのname、priceが同じ値ならtrueを返す
            if( item.name.equals(this.name) && item.price == this.price) {
                return true;
            }
            return false;
        } else {
            return false;
        }
    }
}

Q002

(Item.java)

public class Item {
    public String name;
    public int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String toString() {
        return "商品名:" + name + " 価格:" + price;
    }
}

Q003

(Triangle.java)

public class Triangle {
    public int bottom;      //底辺
    public int height;      //高さ

    public Triangle(int bottom, int height) {
        this.bottom = bottom;
        this.height = height;
    }

    public boolean equals(Object obj) {
        //引数objがnullならfalseを返す
        if( obj == null ) return false;
        //引数objがTriangle型のインスタンスかどうかをチェック
        if( obj instanceof Triangle ) {
            //Triangle型に変換
            Triangle triangle = (Triangle)obj;
            //2つのインスタンスのメンバ変数bottom,heightがいずれも同じならtrueを返す
            if( this.bottom == triangle.bottom &&
                this.height == triangle.height ) {
                return true;
            }
        }
        return false;
    }

    public String toString() {
        return "底辺:"+bottom+" 高さ:"+height+" 面積:"+(bottom*height/2);
    }
}

おわりに

いかがでしたでしょうか。Objectクラスのもつメソッドを適切にオーバーライドすることで、Javaの標準APIとして提供されているクラスの活用方法もさらに広がります。Javaプログラミング練習問題は継続して増やしていく予定です。引き続き日々の学習にご活用いただけますと幸いです。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

タイトルとURLをコピーしました