プログラミング 第12回

19
ププププププププ 12 1 プププププププ プ 12 プププププププププププププ [email protected]

description

プログラミング 第12回. スーパークラスとサブクラス [email protected]. クラス階層. あるクラスのフィールドやメソッドを増やして新しいクラスを作ることを extend というキーワードで表す。 新しいクラスは元のクラスのサブクラス,元のクラスは新しいクラスのスーパークラスと呼ばれる 。 スーパークラスはより一般的なオブジェクトの挙動,サブクラスは特殊化された挙動の雛型とみることができる。. Rectangle. class Rectangle{ int width; int height; - PowerPoint PPT Presentation

Transcript of プログラミング 第12回

Page 1: プログラミング 第12回

プログラミング第12回 1

プログラミング 第12回

スーパークラスとサブクラス[email protected]

Page 2: プログラミング 第12回

プログラミング第12回 2

クラス階層• あるクラスのフィールドやメソッドを増やして

新しいクラスを作ることを extend というキーワードで表す。

• 新しいクラスは元のクラスのサブクラス,元のクラスは新しいクラスのスーパークラスと呼ばれる。

• スーパークラスはより一般的なオブジェクトの挙動,サブクラスは特殊化された挙動の雛型とみることができる。

Page 3: プログラミング 第12回

プログラミング第12回 3

Rectangleclass Rectangle{

int width; int height;

Rectangle(){setSize(10,20);}

Rectangle(int w, int h){

width=w; height=h; }

void setSize(int w, int h){

width=w; height=h; }

int getArea(){return width*height;}

}

Page 4: プログラミング 第12回

プログラミング第12回 4

NamedRectangleclass NamedRectangle extends Rectangle {

String name;

NamedRectangle(){

// ここで super() の自動実行

name="NO NAME";

}

NamedRectangle(String name){

// ここで super() の自動実行

this.name=name;

}

}

Page 5: プログラミング 第12回

プログラミング第12回 5

スーパークラスのコンストラクタの自動呼出し

• コンパイラの仕事• this(), super() が constructor

の最初に書かれていない場合は,コンパイラによって自動的に挿入される。

Page 6: プログラミング 第12回

プログラミング第12回 6

継承 (inheritance) と is-a 関係• サブクラスはスーパークラスの属性を

すべて「継承」する。• サブクラスのインスタンス is a スーパ

ークラスのインスタンス .

• 合成と has-a 関係については,後に詳しく学ぶ。

Page 7: プログラミング 第12回

プログラミング第12回 7

Override と overload

• override とはスーパークラスでのメソッドの定義を無効にしてやり直すこと。

• overload とは同じメソッド名で signatureの異なるメソッドを追加定義すること。元からあったメソッドは無効にはならない。

• final メソッドは overide できない。

Page 8: プログラミング 第12回

プログラミング第12回 8

アクセス制御• private がついているフィールドやメソ

ッドはサブクラスの中から参照,呼び出しができない。

• public はその逆。 protected というのもあるが上級編で。

Page 9: プログラミング 第12回

プログラミング第12回 9

抽象クラス• フックメソッドとテンプレートメソッド• テンプレートメソッドは抽象クラスで定

義を固定する。• フックメソッドは抽象クラスで具体化し

ない。• フックメソッドはサブクラスで具体的に

定義する。

Page 10: プログラミング 第12回

プログラミング第12回 10

Player.java (List 12-11, p.69)

abstract class Player{

public abstract void play();

public void loop(int n){

for(int i=0; i<n; i++){

play();

}

}

}

フックメソッド

テンプレート

メソッド

Page 11: プログラミング 第12回

プログラミング第12回 11

TextPlayer.java(List 12-12,p.70)

public class TextPlayer extends Player{

String text;

public TextPlayer(String text){

this.text=text;

}

public void play(){

System.out.println(text);

}

Page 12: プログラミング 第12回

プログラミング第12回 12

TextPlayer.java (2)

public static void main(String[] args){

TextPlayer player=new TextPlayer(

" こんにちは ");

player.loop(3);

}

}

Page 13: プログラミング 第12回

プログラミング第12回 13

実行例

こんにちはこんにちはこんにちは

Page 14: プログラミング 第12回

プログラミング第12回 14

CharacterPlayer.java (1)

public class CharacterPlayer extends Player{ char moji; public CharacterPlayer(char moji){ this.moji=moji; } public void play(){ System.out.print(moji); }

Page 15: プログラミング 第12回

プログラミング第12回 15

CharacterPlayer.java (2)

public static void main(String[] args){ CharacterPlayer player= new CharacterPlayer(' 浩 '); player.loop(10); }}

Page 16: プログラミング 第12回

プログラミング第12回 16

実行例

浩浩浩浩浩浩浩浩浩浩

Page 17: プログラミング 第12回

プログラミング第12回 17

PlayerTest.java

public class PlayerTest{ public static void main(String[] args){ Player p1=new TextPlayer(" ごきげんいかが?"); Player p2=new CharacterPlayer(' 浩 '); p1.loop(3); p2.loop(3); p1.loop(5); p2.loop(5); }}

Page 18: プログラミング 第12回

プログラミング第12回 18

PlayerTest2.java

public class PlayerTest2{ public static void main(String[] args){ Player[] p={ new TextPlayer(" ごきげんいかが?"), new CharacterPlayer(' 浩 ')}; p[0].loop(3); p[1].loop(3); p[0].loop(5); p[1].loop(5); }}

Page 19: プログラミング 第12回

プログラミング第12回 19

課題• 問題12-4• 問題12-5• 余裕があったら,問題12-6