pi-7. クラスの抽象化,メソッドのオーバーライド

-- Views

January 26, 22

スライド概要

Java の基本
URL: https://www.kkaneko.jp/cc/pi/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

pi-7. クラスの抽象化, メソッドのオーバーライド (Java の基本) URL: https://www.kkaneko.jp/cc/pi/index.html 金子邦彦 1

2.

• 2つの似たような「クラス」が必要になるとき、 なるべく、ミスを減らしたい → 継承、クラスの抽象化 が有効 前回と今回の授業で説明 2

3.

アウトライン 番号 項目 説明時間の 目安 7-1 スーパークラスとサブクラス 8分 7-2 クラスの抽象化 4分 7-3 クラス階層 11分 7-4 クラス階層に関する実演・実習 7分 7-5 メソッドのオーバーライド 7分 各自、資料を読み返したり、課題に取り組んだりも行う この授業では、Java を用いて基礎を学び、マスターする 3

4.

全体まとめ • 類似した複数のクラスがあるとき, 共通する機能をスーパークラスにまとめることを 考えることができる. • メソッドのオーバーライドとは,スーパークラス のメソッドの実装を,サブクラスで上書きするこ と 4

5.

7-1.スーパークラスと サブクラス 5

6.

場所(6, 8) 色 red Figure 半径 3,場所(2, 4) 色 green 円(Circle) 6

7.

Java のオブジェクトの生成 次の2つのオブジェクトを生成する Java プログラム x 2 x 4 y "green" 3 color r a 6 x 8 "red" y color • このとき,次のクラスを使うことにする クラス名 Figure 属性 x, y, color クラス名 Circle コンストラクタ コンストラクタ 属性 x, y, color, r 7

8.

Java Tutor Java などのプログラミング言語の体験, 演習ができるオンラインサービス ① ウェブブラウザで次の URL を開く http://www.pythontutor.com/ 8

9.

使用上の注意点1 • 次のような表示が出ることがある → 無視してよい 過去の文法ミスに関する確認表示 邪魔なときは「Close」 9

10.

使用上の注意点2 「please wait ... executing」のとき、10秒ほど待つ. → 混雑しているときは、 「Server Busy・・・」 というメッセージが出ることがある. 混雑している.少し(数秒から数十秒)待つと自 動で表示が変わる(変わらない場合には,操作を もう一度行ってみる) 10

11.

② 「Java Tutor」をクリック 11

12.

① Java Tutor で,次のソースコードを入れる クラス定義 クラス定義 コンストラクタによるオブジェクト生成 12

13.

② 実行.実行結果を確認 「Visualize Execution」をクリック, 「Last」をクリック. (あとで使うので、プログラムを消さないこと) 2つのオブジェクト x, a が生成される 13

14.

継承の例 • 継承とは,スーパークラスの属性とメソッドをサブ クラスが受け継ぐこと Figure 属性 Circle 属性 x x y y color color スーパークラス r 追加 サブクラス 14

15.

クラス Circle の定義 class Circle extends Figure { double r; public Circle(double x, double y, String color, double r) { super(x, y, color); this.r = r; } } あるクラスが別のクラスのサブクラスであるとき ① 「extends Figure」のように、スーパークラス名を指定 ② コンストラクタ内では「this.r = r」(Circle にしかない 属性を初期化) ③ スーパークラスで定義されている属性 x, y, color の初期 化は「super(x, y, color)」 15

16.

7-2.クラスの抽象化 16

17.

半径 3,場所(2, 4) 色 green 円(Circle) 幅 1, 高さ 2, 場所(6, 4) 色 black 長方形 (Rectangle) 17

18.

クラスの類似性 • 類似した2つのクラス 円 (Circle) 長方形 (Rectangle) 属性 属性 x y color r 半径 x x, y, color は 共通 y color width 幅 height 高さ 18

19.

クラス • クラスは,同じ種類のオブジェクトの集まりと考 えることができる 図形 円 (Circle) 円でもあり図形でもある 長方形 (Rectangle) 長方形でもあり図形でもある 19

20.

クラスの抽象化 円 (Circle) 長方形 (Rectangle) 図形 (Figure) 属性 属性 属性 x x x y y y color r 半径 color width color 幅 height 高さ 共通属性を持つ 20

21.

7-3.クラス階層 21

22.

類似した複数のクラスがあるとき, 共通する機能をスーパークラスにまとめることを 考えることができる. • プログラムのミスを減らすため • 将来,サブクラスを増やすときにも有効 22

23.

半径 3,場所(2, 4) 色 green 円(Circle) 幅 1, 高さ 2, 場所(6, 4) 色 black 長方形 (Rectangle) 23

24.

Java のオブジェクトの生成 次の2つのオブジェクトを生成する Java プログラム x 2 x 4 y "green" color 3 r a 4 y "black" color 1 2 width height 6 x 24

25.

クラス階層は何のため? • 似通ったクラス Circle, Rectangle を使いたい.プロ グラムのミスを減らすため • 将来,図形の種類を増やすときにも有効 Figure 親 子 Circle 親 子 Rectangle クラス Circle, クラス Rectangle が似ている. 共通する機能を、スーパークラス Figure にまとめる. 25

26.

① Java Tutor で,次のソースコードを入れる クラス定義を追加 26

27.

続き コンストラクタによるオブジェクト生成 27

28.

② 実行.実行結果を確認 「Visualize Execution」をクリック, 「Last」をクリック. (あとで使うので、プログラムを消さないこと) 2つのオブジェクト x, a が生成される 28

29.

クラス階層を考える場合 クラス名 Figure: 属性 x, y, color コンストラクタ クラス名 Circle: 属性 x, y, color, r コンストラクタ クラス名 Rectangle: 属性 x, y, color, width, height コンストラクタ 29

30.

クラス階層を考えない場合 クラス名 Circle: 属性 x, y, r, color 前のページのプログラムと、 「できること」は同じ コンストラクタ クラス名 Rectangle: 属性 x, y, width, height, color コンストラクタ 30

31.

7-4.クラス階層に関する 実演・実習 31

32.

Java のメソッド • 上下左右の移動を考える • オブジェクトの属性 x, y を増減 • そのためのメソッド move を定義 y 左 x が減る 上 y が増える 右 x が増える 下 y が減る x 32

33.

① Java Tutor で,次のソースコードを入れる Figure クラスに メソッド move を追加 33

34.

続き メソッド move を呼び出す 34

35.

② 実行.実行結果を確認 「Visualize Execution」をクリック, 「Last」をクリック. (あとで使うので、プログラムを消さないこと) 35

36.

スーパークラスのメソッドは、サブクラスに継承さ れる. メソッド move を呼び出す x は Circle クラスのオブジェクト a は Rectangle クラスのオブジェクト 36

37.

クラス階層を考える場合 スーパークラスの 属性とメソッドは、 サブクラスに継承 される 37

38.

クラス階層を考えない場合 前のページのプログラムと、 「できること」は同じ 同じプログラムを 繰り返し書く 38

39.

同じようなプログラムを繰り返し書きたいですか? 作成もテストも手間がかかりそう ⇒ クラス階層により解決できる場合がある 39

40.

7-5. メソッドのオーバーライド 40

41.

メソッドのオーバーライドが必要な場合 • 同じ名前のメソッドが,クラスによって違った意 味を持つ メソッド area クラス Figure では 0 クラス Circle では 円の面積 クラス Rectangle では 長方形の面積 41

42.

① Java Tutor で,次のソースコードを入れる Figure クラスに メソッド area を追加 Circle クラスに メソッド area を追加 42

43.

続き Rectangle クラスに メソッド area を追加 メソッド area を呼び出す部分 43

44.

② 実行.実行結果を確認 「Visualize Execution」をクリック, 「Last」をクリック. 44

45.

メソッドのオーバーライド • メソッドのオーバーライドとは,スーパークラス のメソッドの実装を,サブクラスで上書きするこ と • オーバーライドしていない場合には,スーパーク ラスでのメソッドの実装がそのまま使用される (「必ずオーバーライドしないといけない」という わけではない) 45

46.
[beta]
ソースコード 7-1
class Figure {
double x;
double y;
String color;
public Figure(double x, double y, String color) {
this.x = x;
this.y = y;
this.color = color;
}
}
class Circle extends Figure {
double r;
public Circle(double x, double y, String color, double r) {
super(x, y, color);
this.r = r;
}
}
public class YourClassNameHere {
public static void main(String[] args) {
Circle x = new Circle(2, 4, "green", 3);
Figure a = new Figure(6, 8, "red");
}
}

46

47.
[beta]
ソースコード 7-3
class Figure {
double x;
double y;
String color;
public Figure(double x, double y, String color) {
this.x = x;
this.y = y;
this.color = color;
}
}
class Circle extends Figure {
double r;
public Circle(double x, double y, String color, double r) {
super(x, y, color);
this.r = r;
}
}
class Rectangle extends Figure {
double width;
double height;
public Rectangle(double x, double y, String color, double w, double h) {
super(x, y, color);
this.width = w;
this.height = h;
}
}
public class YourClassNameHere {
public static void main(String[] args) {
Circle x = new Circle(2, 4, "green", 3);
Rectangle a = new Rectangle(6, 4, "black", 1, 2);
}
}

47

48.
[beta]
ソースコード 7-4
class Figure {
double x;
double y;
String color;
public Figure(double x, double y, String color) {
this.x = x;
this.y = y;
this.color = color;
}
public void move(double xx, double yy) {
this.x = this.x + xx;
this.y = this.y + yy;
}
}
class Circle extends Figure {
double r;
public Circle(double x, double y, String color, double r) {
super(x, y, color);
this.r = r;
}
}
class Rectangle extends Figure {
double width;
double height;
public Rectangle(double x, double y, String color, double w, double h) {
super(x, y, color);
this.width = w;
this.height = h;
}
}

public class YourClassNameHere {
public static void main(String[] args) {
Circle x = new Circle(2, 4, "green", 3);
Rectangle a = new Rectangle(6, 4, "black", 1, 2);
x.move(10, 20);
a.move(30, 40);
}
}

48

49.
[beta]
ソースコード 7-5
class Figure {
double x;
double y;
String color;
public Figure(double x, double y, String color) {
this.x = x;
this.y = y;
this.color = color;
}
public void move(double xx, double yy) {
this.x = this.x + xx;
this.y = this.y + yy;
}
public double area() {
return 0;
}
}

class Circle extends Figure {
double r;
public Circle(double x, double y, String color, double r) {
super(x, y, color);
this.r = r;
}
public double area() {
return this.r * this.r * 3.14;
}
}
class Rectangle extends Figure {
double width;
double height;
public Rectangle(double x, double y, String color, double w, double h) {
super(x, y, color);
this.width = w;
this.height = h;
}
public double area() {
return this.width * this.height;
}
}
public class YourClassNameHere {
public static void main(String[] args) {
Circle x = new Circle(2, 4, "green", 3);
Rectangle a = new Rectangle(6, 4, "black", 1, 2);
System.out.printf("%f\n", x.area());
System.out.printf("%f\n", a.area());
}
}

49