自作クラスと toString()
さて、今度は先ほどのプログラムの代わりに、自作クラスを要素に入れてみましょう。まずは、ArrayList を使ってみます。
ポイントは、
- 自作クラスの表示ってどうやるの?
です。
toString()の定義
public class MyPoint {
final int x;
final int y;
public MyPoint(int x, int y) {
this.x=x;
this.y=y;
}
public int sum() { return x+y; }
/* 以下をコメントアウトした場合の実行も試しましょう*/
public String toString() {
return "(x: " + x + ", y: " + y + ")";
}
}
- なんてことない、簡単なクラス。普段なら、java.awt.Point あたりを使うところ。
toString()
は、コメントアウトした場合の実行も試しましょう。
利用側のクラス
public class UseSampleP0 {
public static void main(String[] args){
/* ArrayList で実験 */
ArrayList<MyPoint> plist = new ArrayList<MyPoint>();
addRecordSamples(plist); /* 要素を詰める */
System.out.println("plist: " + plist); /* 表示 */
}
public static void addRecordSamples(Collection<MyPoint> rcol) {
rcol.add(new MyPoint(3,4));
rcol.add(new MyPoint(2,18));
rcol.add(new MyPoint(9,7));
rcol.add(new MyPoint(2,18));
rcol.add(new MyPoint(2,10));
}
}
- 今回のプログラムでは、要素表示は
ArrayList
,TreeSet
のtoString()
に任せてあります。
理解のまとめ
まずは、実行結果見てみましょう。
MyPoint.java
の toString()
をコメントアウトして実行
plist: [kobeU.cs.samplesCol.MyPoint@f62373, kobeU.cs.samplesCol.MyPoint@19189e1, kobeU.cs.samplesCol.MyPoint@1f33675, kobeU.cs.samplesCol.MyPoint@7c6768, kobeU.cs.samplesCol.MyPoint@1690726]
MyPoint.java
の toString()
定義を生かして実行
plist: [(x: 3, y: 4), (x: 2, y: 18), (x: 9, y: 7), (x: 2, y: 18), (x: 2, y: 10)]
ポイント
MyPoint
のtoString()
を定義しないと、中身が良く分からない表示になってしまう。- 実は、
Collection
側は、要素表示に、各要素の java.lang.Object のtoString()
メソッド呼んでいるだけ。 - つまり、コメントアウト版では、親クラス
Object
のtoString()
が呼ばれている。 - 自作クラスで
toString()
を再定義すれば、表示方法を制御できる。 Integer
,ArrayList
,TreeSet
のtoString()
も、(どこかで)再定義されたもの。- これも、polymorphism の例。