08. Javaでオブジェクト指向(3/x)

課題1

先週の課題を拡張forループ(foreach)版に修正する。

先回のページの作業済みファイルをDLして利用してもよい。

SountTest2クラスの作成:

プロジェクト java2 を新規作成する。

プロジェクト java1 の中の SountTest2 クラスをコピーし

プロジェクト java2 の src の中に貼り付ける。

※同じ名前のクラスのファイルは、異なるプロジェクトに配置すればエラーにならない。

※パッケージについて:

eclipse で 新規クラス作成 をメニューまたは右クリックから実行すると、クラスが配置されるパッケージ名がプロジェクト名と同名で作成される。

package 宣言文が追加される。

SoundTest2.javaファイルを java2プロジェクトの src にコピペすると、元のパッケージ宣言は削除され、何もパッケージ宣言のない、デフォルトパッケージにコードが配置される。

プログラムを拡張forループ(foreach)版に修正する。

音階データ生成部分:

int i = 0;

for (byte[] bs : buf) {

int[] rs = rate[i++];

for(int j = 0; j < bs.length; j++) {

bs[j] = (byte) (j * rs[0]/rs[1] % 256 - 128);

}

//この初期化の方法は誤り。

//配列の要素の値のコピーが一時変数 b に渡されるだけで、b への書き込みは配列に反映されない。

// for (byte b : bs) {

// b = (byte) (j++ * rs[0]/rs[1] % 256 - 128);

// }

}

再生部分:

for (int[] is : score) {

line.write( buf[ is[0] ] , 0, buf[0].length / is[1]);

}

Javaのオブジェクト指向に関する文法の確認

Java で、SNAP! のOOPの例題に出てきた counter と buzzer を実装する。

講義資料:

(参考1) WebClass の 全学共通コース → Java入門 → 第6章(クラス)第7章(クラス継承)

↑ Javaの文法的な部分についてはこちらのテキストで確認できます(Webにも多数の解説サイトあり)。 オブジェクト指向としての例はちょっと微妙(Webにもなかなか良い例示が少ない)。

課題2

CounterTestクラスの作成:

プロジェクト java2

クラス CounterTest を作成 ・メソッド・スタブの main を使用する(チェックボックス ON) を忘れずに!

コード例)

public class CounterTest {

public static void main(String[] args) {

Counter c1 = new Counter();

Counter c2 = new Counter();

System.out.println(c1.next());

System.out.println(c1.next());

System.out.println(c2.next());

System.out.println(c2.next());

System.out.println(c2.next());

System.out.println(c1.total);

System.out.println(c2.total);

System.out.println(Counter.total);

c1.reset(10);

System.out.println(c1.next());

System.out.println(c1.next());

System.out.println(c1.next());

System.out.println(c1.next());

Buzzer buzz = new Buzzer();

int i = 0;

while (i++ < 30){

System.out.println(buzz.next());

}

Cycle cc = new Cycle(10);

i = 0;

while (i++ < 30){

System.out.println(cc.next());

}

}

}
class Counter {

static int total = 0;

int count = 0;

int next() {

total++;

return ++count;

}

void reset(int i) {

count = i;

}

}
class Buzzer extends Counter {

int next() {

super.next();

if (count % 7 == 0) {

System.out.println("Buzz");

}

return count;

}

}
class Cycle extends Counter {

int limit;

Cycle(int limit) {

this.limit = limit;

}

int next() {

super.next();

if(count == limit) {

count = 0;

}

return count;

}

}

出力結果

1
2
1
2
3
5
5
5
11
12
13
14
1
2
3
4
5
6
Buzz
7
8
9
10
11
12
13
Buzz
14
15
16
17
18
19
20
Buzz
21
22
23
24
25
26
27
Buzz
28
29
30
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0

課題3

課題1の SountTest2 クラスをコピーして 同じプロジェクトに貼り付ける。 自動的に SountTest3クラスが作成される。

波形クラス Wave

メソッド byte signal(int t) 8ビットモノラル音声信号のある時刻の値

メソッド byte next() 8ビットモノラル音声信号を1つ求める

MakeNote クラス

Wave 音程 音長 音量 の4つから Note を組み立てる Builder

音符クラス Note

プロパティ サウンドバッファ

再生メソッド sound

ブザーのクラス Buzzer の定義

Note を複数持つ楽器

楽譜のクラス Score

音程 音長 音量 のシーケンス

演奏メソッド play

課題提出について:

eclipseのワークプレイスのフォルダを zip 圧縮して、後日、他の回の課題と一緒にまとめて webclass に課題提出。