Javaで配列のtoString()メソッドはオーバーライドできる?実現できない理由と3つの代替方法を解説
Javaでは、ObjectクラスのtoString()メソッドをオーバーライドすることは可能です。しかし、特定のクラスのオブジェクト配列を作成し、その配列自体のtoString()をオーバーライドして配列の中身を出力したい場合、残念ながらそれはできません。現時点のJavaには、配列のtoString()を直接オーバーライドする手段が用意されていないためです。
とはいえ、他の方法を使えば同じ目的を簡単に達成できます。ここでは、代表的な3つのアプローチを紹介します。
方法1:ArraysクラスのtoString()メソッドを使う
java.util.ArraysクラスのtoString()メソッドは、配列(String配列だけでなく任意の型の配列)を受け取り、その内容を文字列として返します。引数として自分のオブジェクト配列を渡すだけで、各要素に対してオーバーライド済みのtoString()が呼び出され、読みやすい形式で出力されます。
サンプルコード
import java.util.Arrays;
class Student {
String name = "Krishna";
int age = 20;
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Name: "+this.name+" "+"Age: "+this.age;
}
}
public class Example {
public static void main(String args[]) {
Student std1 = new Student("Krishna", 20);
Student std2 = new Student("Radha", 25);
Student std3 = new Student("Trupthi", 30);
Student std4 = new Student("David", 35);
Student std5 = new Student("Moksha", 40);
Student students[] = {std1, std2, std3, std4, std5};
System.out.println(Arrays.toString(students));
}
}実行結果
[Name: Krishna Age: 20, Name: Radha Age: 25, Name: Trupthi Age: 30, Name: David Age: 35, Name: Moksha Age: 40]
方法2:ArraysクラスのasList()メソッドを使う
asList()メソッドは、配列を引数として受け取り、その内容を持つListオブジェクトを返します。このメソッドで配列をリストに変換してから出力すれば、各要素のtoString()の結果が反映された形で表示されます。
サンプルコード
import java.util.Arrays;
class Student {
String name = "Krishna";
int age = 20;
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Name: "+this.name+" "+"Age: "+this.age;
}
}
public class Example {
public static void main(String args[]) {
Student std1 = new Student("Krishna", 20);
Student std2 = new Student("Radha", 25);
Student std3 = new Student("Trupthi", 30);
Student std4 = new Student("David", 35);
Student std5 = new Student("Moksha", 40);
Student students[] = {std1, std2, std3, std4, std5};
System.out.println(Arrays.asList(students));
}
}実行結果
[Name: Krishna Age: 20, Name: Radha Age: 25, Name: Trupthi Age: 30, Name: David Age: 35, Name: Moksha Age: 40]
方法3:ArrayListクラスを継承する
少し発想を変えた解決策もあります。手順は以下のとおりです。
ArrayListクラスを継承した独自のクラスを作成する。
そのクラスにオブジェクトを追加する。
ArrayListが持つtoString()メソッドを使って内容を出力する。
ArrayListは内部で各要素のtoString()を呼び出すため、オーバーライドされた結果がそのまま出力されます。
サンプルコード
import java.util.ArrayList;
import java.util.Arrays;
class Student {
String name = "Krishna";
int age = 20;
Student(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Name: "+this.name+" "+"Age: "+this.age;
}
}
public class Example extends ArrayList<Object> {
public static void main(String args[]) {
Example obj = new Example();
obj.add(new Student("Krishna", 20));
obj.add(new Student("Radha", 25));
obj.add(new Student("Trupthi", 30));
obj.add(new Student("David", 35));
obj.add(new Student("Moksha", 40));
System.out.println(obj.toString());
}
}実行結果
[Name: Krishna Age: 20, Name: Radha Age: 25, Name: Trupthi Age: 30, Name: David Age: 35, Name: Moksha Age: 40]
まとめ
Javaでは配列自体のtoString()をオーバーライドすることはできませんが、Arrays.toString()、Arrays.asList()、あるいはArrayListの継承という3つの方法を使えば、オブジェクト配列の内容を意図どおりの形式で出力できます。用途や設計に応じて最適な方法を選びましょう。
-
JavaでJSON配列を作成する方法をわかりやすく解説
JSON配列とは、角括弧で囲まれた値の順序付きコレクションのことです。具体的には「[」で始まり「]」で終わり、配列内の各値はカンマ(,)で区切られます。JSON配列のサンプル{ books: [Java, JavaFX, Hbase, Cassandra, WebGL, JOGL] }json-simpleは、JSONオブジェクトを処理するための軽量ライブラリです。このライブラリを使えば、JavaプログラムからJSONドキュメントの内容を読み取ったり、書き込んだりすることができます。json-simpleのMaven依存関係json-simpleライブラリを使用するには、まずpom.x
-
JavaのtoString()メソッドをオーバーライドする目的とは?意味と実装例を解説
JavaにおけるtoString()メソッドとは、どのような役割を持つメソッドなのでしょうか? toString()は、クラスのオブジェクトを文字列(String)として表現したい場合に使用するメソッドです。このメソッドを呼び出すと、オブジェクトの内容をテキスト形式で返してくれます。 実は、オブジェクトをSystem.out.println()などで出力するとき、Javaコンパイラは自動的にそのオブジェクトのtoString()メソッドを呼び出します。つまり、toString()を適切にオーバーライドしておけば、オブジェクトの中身がわかりやすい形で出力されるようになります。 それでは、具体的な