質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

3回答

1565閲覧

Javaのitaratorについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

0クリップ

投稿2015/07/06 17:12

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

kaputaros

総合スコア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

swordone

総合スコア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

KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問