Javaを習いだして最初の壁。コンストラクター
プログラムを習いに行きだして1ヵ月。
「やばい。授業においつけてない。」と悟って一体なにがわからないのか?なにがつまずいた?から掘り起こして考えてみました。
順を追って見ていった時に致命的にわからなくなったところの例文がここ。
※MemberListクラス(MemberListファイル)
public class MemberList {
public static void main(String[] args) {
Member[] members = {
new Member("1", "かわい", 1, "吹奏楽", "いきもの"),
new Member("2", "きよふじ", 2, "新聞", "委員長"),
new Member("3", "しんどう", 3, "サッカー", "給食")
};
for (Member student : members) {
System.out.println(student);
}
}
}
※Memberクラス(Memberファイル)
class Member {
private String id;
private String name;
private int rank;
private String club;
private String position;
public Member(String id, String name, int rank, String club, String position) {
this.id = id;
this.name = name;
this.rank = rank;
this.club = club;
this.position = position;
}
@Override
public String toString() {
return String.format("%s %s %d %s %s",
id,name,rank,club,position);
}
}
※実行結果
1 かわい 1 吹奏楽 いきもの
2 きよふじ 2 新聞 委員長
3 しんどう 3 サッカー 給食
プロセスは終了コード 0 で終了しました
実行結果とMemberListクラスファイルを見る限り名前なんかの情報をリストとして表示してるのはわかる!
けれども、なにをどのような構造でそうなってるのかは読めない。
この類の構文で急に読めなくて進捗がとまった!
ここに辿り着くまでにint型String型にif文for文に配列[]などなど有ったてなんとなくは理解できたけど、こいつは読めねぇ?!
まず、この構文を解いて自分自身の状況を考察する!
■構文の正体はコンストラクター
結論を言うとこの構文はコンストラクターの例文です。
……。
まて、コンストラクターってなんだ?
………。
ググりまくって調べまくって自分なりに解読しました。
かいつまんでプログラミング初心者目線で解説すると。
コンストラクター とは
必要な情報入れたインスタンス(変数に入れたクラス)を作るためのテンプレート状態のクラス。クラス名と同じ名前の代表的なメソッドを持っているのでインスタンスを作ると代表的なメソッドが動くし他に内包するメソッドも呼び出して使える。
みたいな。 合ってるかな?(笑)
ちょっと構造が初心者には優しくないので図解してみた!
結論。
コンストラクターは実行メソッドに加えるメソッドのカタチをした部品(オブジェクト)だ。
だいぶん読み取りしやすくなったのでソースコードに注釈をつけておきます。
mainメソッド
public class MemberList {
public static void main(String[] args) {
//Memberクラス型を配列で扱い 変数membersに入れるよの記述。
//クラスで作ったコンストラクターに値を当てはめて変数に入れる事でインスタンスとしてできあがります
Member[] members = {
//newでMemberクラスのメソッドを呼び出して実引数を指定してます。
//newでクラスを呼びだした時は入れる変数の型もクラスの型にしないとならない。
//( )の中にコンストラクターで決めた引数の実際に必要な値をいれてきます。型もあわせてね!
new Member("1","かわい", 1, "吹奏楽", "いきもの"),
new Member("2","きよふじ", 2, "新聞", "委員長"),
new Member("3","しんどう", 3, "サッカー", "給食")
};
//出来上がったインスタンスをつかって繰り返し表示するfor文のメソッド。
//データがあるぶんだけ繰り返す書き方してる。拡張for文なので理解してないと構造が読みにくい。
for (Member member : members) {
System.out.println(member);
}
}
}
class Member {
//フィールドの部分。 変数の型と変数を指定します。
private String id;
private String name;
private int rank;
private String club;
private String position;
//コンストラクターの代表的なメソッドを記述。代表なのでクラス名と同じメソッド名前にするのがルール。
//( )の中は必要な引数とその型を記述します。
public Member(String id, String name, int rank, String club, String position) {
//thsi.はフィールドで記述した変数を指定してる。 =の右側の変数は↑メソッドの()で記述した引数。
this.id = id;
this.name = name;
this.rank = rank;
this.club = club;
this.position = position;
}
//@Overrideオーバーライド。 上書きする処理。
//String toStringメソッドはなんでも文字列で表示してくれるメソッド。やらないとおかしな文字列で表示されちゃう
//フィールドの変数をtoStringで正しく文字列表示できるようにしつつString.formatで表示のテンプレを作ってる。%が書式の宣言でアルファベットが型を指定してるよ
@Override
public String toString() {
return String.format("%s %s %d %s %s",
id,name,rank,club,position);
}
}
コンストラクターを教わった時に急に理解が滞った原因は、情報量の多さとコンストラクター自体がどういう動作をしてmainメソッドに反映しているかが見えなかったからと今になれば思う。