Javaでデザインパターンを勉強中なのですが、itaratorのしょっぱなから理解できません。
http://www.techscore.com/tech/DesignPattern/Iterator/Iterator1.html/#dp1-2
ここのStudentクラスはわかるのですが、StudentListから良くわかりません。
protected Student[] students;
これは一体何をしているのでしょうか?配列なのでしょうか?
public void add(Student student){
students[last] = student;
last++;
}
ここも良くわかりません。
addの引数は何をあらわあしているのでしょう?
私は現状何が分からないのかわかりません。何が足りないのかご教授願います
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
こんにちは。
protected Student[] students;
これは一体何をしているのでしょうか?配列なのでしょうか?
はい、配列です。String[]とかと同じように、オブジェクトの配列になります。
Studentクラスのインスタンスをいくつも詰めておく箱のようなものです。
なので、中身は Student型 でなくてはなりません。
public void add(Student student){
students[last] = student;
last++;
}
ここも良くわかりません。
addの引数は何をあらわあしているのでしょう?
add(Student student)の引数は、変数の宣言と同じようなものです。
Student型をここに指定するという宣言です。
変数の宣言と同じようなものなので、add(Student st)とか任意の変数名でもかまいません。
students[last] = student;
ここで、StudentListクラスのフィールド students に Student型のインスタンス を詰めています。
名前が 変数→student と フィールド→student「s」と似ているので混乱されているんじゃないかな?
慣れないうちは、フィールドに"this."をつけるようにすると、分かりやすくなりますよ。
投稿2015/07/07 00:48
総合スコア1844
0
これはイテレータの問題というより,Javaの基本的なプログラム構造の問題ですね.
classファイルは,そのクラスの設計図及び取扱説明書のようなものとお考え下さい.
今,StudentListクラスは「部品」として,Studentの配列studentsとint型変数lastが必要とされています.
protected Student[] students; <-これはその「部品」の宣言になります.
そしてコンストラクタでstudentCountにint型整数を渡して,その長さを持つStudent配列を作成します.この時点では,それだけの長さはありますが,中身はありません.「本が入っていない本棚」のような状態です.
こうして作成したStudentListインスタンスに,addメソッドという「操作」で,内部の配列にStudentオブジェクトを追加することができます.
lang
1 public void add(Student student){ //addメソッドの引数は,加えたいStudentオブジェクトです. 2 students[last] = student; //引数として渡されたStudentオブジェクトを配列の最後に足します(注) 3 last++; //「最後の位置」を表す数字を1増やします 4 }
配列は0から始まるので,初期状態の「最後の位置」は0です.1個Studentオブジェクトが入ると,「最後の位置」は1になります.これを繰り返すことで,(最初のstudentCountを超えない限り)次々とStudentオブジェクトをStudentList内の配列に入れていくことができることになります.
投稿2015/07/07 00:36
総合スコア20649
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語など,メモリ上にプログラムが展開されていることを想像しやすい言語を学んでいるかによって,このプログラムの挙動が理解できるか異なります.
C言語を学んでいる人には下の書き方で伝わるかと思います.(同じ意味のコードではありません)
lang
1/* protected Student[] students; に対応,大域変数 */ 2struct Student *students; 3int Students (int studentCount) { 4 /* this.students = new Student[studentCount]; に対応 */ 5 students = (struct Student *)malloc(sizeof(struct Student) * studentCount); 6}
もし学んでいないのであれば,配列とポインタについて調べてみてください.
私も少し解説します.まずはint型で.
lang
1 int[] array; 2 array = new int[10];
配列というのは,例えばintとかの値をメモリ上で連続して確保するものです.
メモリ上で連続しているので,配列の先頭の値がある場所がわかれば,次の値がある場所もわかります.
例えば,10個のintを連続して確保したとき,先頭の値がある場所は100番地だったとします.
次の要素は101番地,その次の要素は102番地,…と並んでいます.
しかし,この100番地という値を覚えておかないと,せっかく作った配列にアクセスすることができなくなります.
Javaではこのような場合に,先頭の場所を覚えておく変数として「int[]」型を使います.
そして,「new int[10];」して10個分のメモリ領域を確保して,その先頭の場所をint[]型のarrayに代入しています.
arrayには100番地という情報が入っていて,array[0]は100番地の値を,array[1]は101番地の値を意味するようになります.
学んでいるソースコードも同様に,Student[]型のstudents変数には,new Students[studentsCount]で確保したStudent型の配列の先頭の場所が格納されます.(正確には,それ以外の情報も格納されます)
で,add()メソッドの挙動ですね.
これは,実際に確保した配列に値を入れていくメソッド(関数)です.
10個分のint型配列を確保しても,その中身は空っぽです.
これを{ , , , , , , , , , }で表現するとします.
その状態から,add(10),add(20),add(0)と3回add()メソッドを実行すると,{10, 20, 0, , , , , , , }となります.
(Studentクラスのadd()メソッドがint型にもあると思ってください)
もう少し詳しく説明すると,変数lastには最初0が入っています.
その状態であれば,students[last]は確保した配列の最初の場所を指します.
add(studentA)と呼ぶと,最初の場所にはstudentAの情報が入ります.
そしてlastが1増えます.
次にadd(studentB)を呼ぶと,students[last]は次の場所を指しているため,
次の場所にstudentBが格納されます.
これをstudentC,studentDに対して繰り返すと,
{studentA, studentB, studentC, student D, , , , , , }
というようになります.
Javaの勉強を多少してからのほうが,イテレータの良さなどがわかると思います.
投稿2015/07/06 18:06
総合スコア751
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。