Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
Java
演習
(9)
–
クラスとメソッド
–
高橋 裕樹
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
クラス
例題
次の
3 種類のブロックが壁に反射しながら水平方向に等速直線運動
するプログラムを作成せよ.
幅
高さ
初期位置
(x,
y
)
x
方向の初速度
ブロック
1
30
10
(0, 50)
1
ブロック
2
10
10
(width - 10, 80)
-2
ブロック
3
50
10
(width / 2, 110)
2
ただし,width は,描画領域の幅である.
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
水平方向に等速直線運動する
3 つのブロック (RectMove4-1.java)
importjavax.swing.JApplet; importjavax.swing.Timer; importjava.awt.Graphics; importjava.awt.Dimension; importjava.awt.event.*;public class RectMove4 extends JApplet{ Dimension d;
intx1, y1, vx1, w1, h1;
intx2, y2, vx2, w2, h2; 10
intx3, y3, vx3, w3, h3; public voidpaint(Graphics g){
g.clearRect(0, 0, d.width, d.height); g.drawRect(x1, y1, w1, h1); g.drawRect(x2, y2, w2, h2); g.drawRect(x3, y3, w3, h3); }
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
水平方向に等速直線運動する
3 つのブロック (RectMove4-2.java)
public voidinit(){ d= getSize();
w1= 30; h1 = 10; x1 = 0; y1 = 50; vx1 = 1;
w2= 10; h2 = 10; x2 = d.width − w2; y2 = 80; vx2 = −2; w3= 50; h3 = 10; x3 = d.width / 2; y3 = 110; vx3 = 2; new Timer(20, new ActionListener(){
public voidactionPerformed(ActionEvent e){ if(x1 < 0 | | x1 + w1 > d.width) vx1 *= −1; x1+= vx1; 10 if(x2 < 0 | | x2 + w2 > d.width) vx2 *= −1; x2+= vx2; if(x3 < 0 | | x3 + w3 > d.width) vx3 *= −1; x3+= vx3; repaint(); } }).start(); } } 20
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
クラス
RectMove4.java の問題点
プログラムが煩雑
変数が多くなる(x1, x2, x3, ...)
同じような処理の繰り返し(
衝突判定,描画)
⇓
クラス
(class) という概念の利用
オブジェクト
(object) ... 具体的な実体
ブロック
属性や状態:
フィールド(field)
ブロックの幅,高さ,位置,速度 操作:
メソッド(method)
ブロックの移動,描画 メンバ:
フィールドとメソッドの総称クラス
(class) ... オブジェクトの雛型
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
クラス
RectMove4.java の問題点
プログラムが煩雑
変数が多くなる(x1, x2, x3, ...)
同じような処理の繰り返し(
衝突判定,描画)
⇓
クラス
(class) という概念の利用
オブジェクト
(object) ... 具体的な実体
ブロック
属性や状態:
フィールド(field)
ブロックの幅,高さ,位置,速度 操作:
メソッド(method)
ブロックの移動,描画 メンバ:
フィールドとメソッドの総称クラス
(class) ... オブジェクトの雛型
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
クラス
RectMove4.java の問題点
プログラムが煩雑
変数が多くなる(x1, x2, x3, ...)
同じような処理の繰り返し(
衝突判定,描画)
⇓
クラス
(class) という概念の利用
オブジェクト
(object) ... 具体的な実体
ブロック
属性や状態:
フィールド(field)
ブロックの幅,高さ,位置,速度 操作:
メソッド(method)
ブロックの移動,描画 メンバ:
フィールドとメソッドの総称クラス
(class) ... オブジェクトの雛型
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
クラス
RectMove4.java の問題点
プログラムが煩雑
変数が多くなる(x1, x2, x3, ...)
同じような処理の繰り返し(
衝突判定,描画)
⇓
クラス
(class) という概念の利用
オブジェクト
(object) ... 具体的な実体
ブロック
属性や状態:
フィールド(field)
ブロックの幅,高さ,位置,速度 操作:
メソッド(method)
ブロックの移動,描画 メンバ:
フィールドとメソッドの総称クラス
(class) ... オブジェクトの雛型
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
フィールドだけを持つクラス
例題
RectMove4.java をフィールドだけを持つクラスを用いて書き直せ.
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
フィールドだけのクラス
(RectMove5-1.java)
importjavax.swing.JApplet; importjavax.swing.Timer; importjava.awt.Graphics; importjava.awt.Dimension; importjava.awt.event.*;public class RectMove5 extends JApplet{ Dimension d;
classBlock{ 10
intx, y; // position
intwidth, height; // width, height intvx; // velocity
}
Block block1, block2, block3; public voidpaint(Graphics g){
g.clearRect(0, 0, d.width, d.height);
g.drawRect(block1.x, block1.y, block1.width, block1.height);
g.drawRect(block2.x, block2.y, block2.width, block2.height); 20
g.drawRect(block3.x, block3.y, block3.width, block3.height); }
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
10-14 行目
Block クラスの定義
ブロックの位置(x, y)
幅width
,高さheight
水平方向の速度vx
クラスの宣言
[クラス修飾子] Class クラス名 { ... }
クラス修飾子
public
他のパッケージからアクセス可,public
がないとアク セス不可abstract
抽象クラス.抽象クラスは抽象メソッドを持つクラス. 抽象メソッドとは,メソッドの本体を定義せず,メ ソッド名,引数とその型,戻り値型,メソッドが投げ る例外だけを宣言したもの.final
継承禁止Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
フィールドだけのクラス
(RectMove5-2.java)
public voidinit(){ d= getSize();
block1 = new Block(); block2 = new Block(); block3 = new Block(); block1.width = 30; block1.height = 10;
block1.x = 0; block1.y = 50; block1.vx = 1; block2.width = 10; block2.height = 10;
block2.x = d.width − block2.width; block2.y = 80; block2.vx = −2; block3.width = 50; block3.height = 10;
block3.x = d.width / 2; block3.y = 110; block3.vx = 2;
10
new Timer(20, new ActionListener(){
public voidactionPerformed(ActionEvent e){
if(block1.x < 0 | | block1.x + block1.width > d.width) block1.vx *= −1;
block1.x += block1.vx;
if(block2.x < 0 | | block2.x + block2.width > d.width) block2.vx *= −1;
block2.x += block2.vx;
if(block3.x < 0 | | block3.x + block3.width > d.width)
block3.vx *= −1; 20 block3.x += block3.vx; repaint(); } }).start(); } }
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
15 行目 (RectMove5-1)
Block オブジェクトを参照するための変数の宣言
3 行目 (RectMove5-2)
Block オブジェクトの生成
オブジェクトの生成
new クラス名 ([引数])
クラス
... オブジェクトの性質を定義しているだけ
4 行目 (RectMove5-2)
オブジェクトのフィールドへ値を代入
メンバへのアクセス
オブジェクト. メンバ
メンバアクセス演算子: . (ピリオド)
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
15 行目 (RectMove5-1)
Block オブジェクトを参照するための変数の宣言
3 行目 (RectMove5-2)
Block オブジェクトの生成
オブジェクトの生成
new クラス名 ([引数])
クラス
... オブジェクトの性質を定義しているだけ
4 行目 (RectMove5-2)
オブジェクトのフィールドへ値を代入
メンバへのアクセス
オブジェクト. メンバ
メンバアクセス演算子: . (ピリオド)
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
15 行目 (RectMove5-1)
Block オブジェクトを参照するための変数の宣言
3 行目 (RectMove5-2)
Block オブジェクトの生成
オブジェクトの生成
new クラス名 ([引数])
クラス
... オブジェクトの性質を定義しているだけ
4 行目 (RectMove5-2)
オブジェクトのフィールドへ値を代入
メンバへのアクセス
オブジェクト. メンバ
メンバアクセス演算子: . (ピリオド)
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
例題
RectMove5.java をメソッドも持つクラスを用いて書き直せ.
RectMove6(RectMove6-1.java)
importjavax.swing.JApplet; importjavax.swing.Timer; importjava.awt.Graphics; importjava.awt.Dimension; importjava.awt.event.*;public class RectMove6 extends JApplet{ Dimension d;
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
RectMove6(RectMove6-2.java)
classBlock{ intx, y; // positionintwidth, height; // width, height intvx; // velocity
Block(){ // constructor
x= y = width = height = vx = 0; }
Block(int px, int py, int pvx, int w, int h){ // constructor 10
x= px; y = py; width = w; height = h; vx = pvx; }
public voidmove(){
if(x < 0 | | x + width > d.width) vx *= −1; x+= vx;
}
public voiddraw(Graphics g){
g.drawRect(x, y, width, height); 20
} }
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
RectMove6(RectMove6-3.java)
public voidinit(){ d= getSize();
block1 = new Block(0, 50, 1, 30, 10); block2 = new Block(d.width − 30, 80, −2, 10, 10); block3 = new Block(d.width / 2, 110, 2, 50, 10); new Timer(20, new ActionListener(){
public voidactionPerformed(ActionEvent e){ block1.move(); block2.move(); block3.move();
repaint(); 10
} }).start(); }
public voidpaint(Graphics g){ g.clearRect(0, 0, d.width, d.height);
block1.draw(g); block2.draw(g); block3.draw(g); }
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
メソッド
メソッド
= 名前 + ブロック (処理のまとまり)
メソッド宣言
[メソッド修飾子] 返り値型 メソッド名 ([型 仮引数,
. . .]){
ブロック
}
メソッド呼び出し
メソッド名
([式,
. . .])
引数
メソッドに受け渡す値のリスト
戻り値
メソッドが返す値
return [式];
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
メソッド
メソッド
= 名前 + ブロック (処理のまとまり)
メソッド宣言
[メソッド修飾子] 返り値型 メソッド名 ([型 仮引数,
. . .]){
ブロック
}
メソッド呼び出し
メソッド名
([式,
. . .])
引数
メソッドに受け渡す値のリスト
戻り値
メソッドが返す値
return [式];
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
メソッド
メソッド
= 名前 + ブロック (処理のまとまり)
メソッド宣言
[メソッド修飾子] 返り値型 メソッド名 ([型 仮引数,
. . .]){
ブロック
}
メソッド呼び出し
メソッド名
([式,
. . .])
引数
メソッドに受け渡す値のリスト
戻り値
メソッドが返す値
return [式];
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
メソッド
メソッド
= 名前 + ブロック (処理のまとまり)
メソッド宣言
[メソッド修飾子] 返り値型 メソッド名 ([型 仮引数,
. . .]){
ブロック
}
メソッド呼び出し
メソッド名
([式,
. . .])
引数
メソッドに受け渡す値のリスト
戻り値
メソッドが返す値
return [式];
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
メソッド
メソッド
= 名前 + ブロック (処理のまとまり)
メソッド宣言
[メソッド修飾子] 返り値型 メソッド名 ([型 仮引数,
. . .]){
ブロック
}
メソッド呼び出し
メソッド名
([式,
. . .])
引数
メソッドに受け渡す値のリスト
戻り値
メソッドが返す値
return [式];
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
メソッド
コンストラクタ
オブジェクトを初期化する特別なメソッド
クラス名と同じ名前
引数は受け取れる
戻り値は返せない
オーバーロード
引数の個数
戻り値型
が異る,同じ名前のメソッドの宣言が可能
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
RectMove6-2.java
Block クラスの宣言
フィールド: x, y, width, height, vx
コンストラクタ: Block(), Block(int, int, int, int, int)
メソッド: move(), draw(Graphics)
6-8 行目 (RectMove6-2.java)
引数を取らないコンストラクタ
フィールドの初期値は全て
0
10-12 行目 (RectMove6-2.java)
5 つの引数を取るコンストラクタ
引数の値でフィールドを初期化
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
14-17 行目 (RectMove6-2.java)
壁との衝突判定
単位時間あたりのボールの移動
フィールドの値
(x, width, vx) を直接参照
19-21 行目 (RectMove6-2.java)
矩形の描画
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
3-5 行目 (RectMove6-3.java)
コンストラクタによるオブジェクトの生成と初期化
9 行目 (RectMove6-3.java)
3 つのブロックオブジェクト (block1, block2, block3) に対して,
move() メソッドの呼び出し
block1.move() ⇒ block1 を単位時間分移動
17 行目 (RectMove6-3.java)
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題
課題
課題
RectMove6.java の Block クラスに setBlockColor メソッドを追加
し,ブロックに色を付けよ.
(public void setBlockColor(int r, int g, int b))
(RectMove7.java)
ヒント:
色を保持する
Color 型のフィールドを作成.setBlockColor で
は,自分のブロックの色を作成する.実際の色指定は,描画メソッド
draw で行う.
Java 演習 (9) – クラスとメソッ ド– 高橋 裕樹 クラス メソッド 課題 宿題