こんにちは。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を返す。
- 引数:
- toStringメソッド
提供コード
(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プログラミング練習問題は継続して増やしていく予定です。引き続き日々の学習にご活用いただけますと幸いです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。