190 likes | 282 Views
プログラミング 第12回. スーパークラスとサブクラス yukita@k.hosei.ac.jp. クラス階層. あるクラスのフィールドやメソッドを増やして新しいクラスを作ることを extend というキーワードで表す。 新しいクラスは元のクラスのサブクラス,元のクラスは新しいクラスのスーパークラスと呼ばれる 。 スーパークラスはより一般的なオブジェクトの挙動,サブクラスは特殊化された挙動の雛型とみることができる。. Rectangle. class Rectangle{ int width; int height;
E N D
プログラミング 第12回 スーパークラスとサブクラス yukita@k.hosei.ac.jp プログラミング第12回
クラス階層 • あるクラスのフィールドやメソッドを増やして新しいクラスを作ることを extend というキーワードで表す。 • 新しいクラスは元のクラスのサブクラス,元のクラスは新しいクラスのスーパークラスと呼ばれる。 • スーパークラスはより一般的なオブジェクトの挙動,サブクラスは特殊化された挙動の雛型とみることができる。 プログラミング第12回
Rectangle class 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;} } プログラミング第12回
NamedRectangle class NamedRectangle extends Rectangle { String name; NamedRectangle(){ // ここで super()の自動実行 name="NO NAME"; } NamedRectangle(String name){ // ここで super()の自動実行 this.name=name; } } プログラミング第12回
スーパークラスのコンストラクタの自動呼出しスーパークラスのコンストラクタの自動呼出し • コンパイラの仕事 • this(), super()がconstructorの最初に書かれていない場合は,コンパイラによって自動的に挿入される。 プログラミング第12回
継承(inheritance)とis-a関係 • サブクラスはスーパークラスの属性をすべて「継承」する。 • サブクラスのインスタンス is a スーパークラスのインスタンス. • 合成とhas-a関係については,後に詳しく学ぶ。 プログラミング第12回
Override と overload • overrideとはスーパークラスでのメソッドの定義を無効にしてやり直すこと。 • overloadとは同じメソッド名でsignatureの異なるメソッドを追加定義すること。元からあったメソッドは無効にはならない。 • finalメソッドはoverideできない。 プログラミング第12回
アクセス制御 • private がついているフィールドやメソッドはサブクラスの中から参照,呼び出しができない。 • publicはその逆。protectedというのもあるが上級編で。 プログラミング第12回
抽象クラス • フックメソッドとテンプレートメソッド • テンプレートメソッドは抽象クラスで定義を固定する。 • フックメソッドは抽象クラスで具体化しない。 • フックメソッドはサブクラスで具体的に定義する。 プログラミング第12回
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(); } } } フックメソッド テンプレート メソッド プログラミング第12回
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); } プログラミング第12回
TextPlayer.java (2) public static void main(String[] args){ TextPlayer player=new TextPlayer( "こんにちは"); player.loop(3); } } プログラミング第12回
実行例 こんにちは こんにちは こんにちは プログラミング第12回
CharacterPlayer.java (1) public class CharacterPlayer extends Player{ char moji; public CharacterPlayer(char moji){ this.moji=moji; } public void play(){ System.out.print(moji); } プログラミング第12回
CharacterPlayer.java (2) public static void main(String[] args){ CharacterPlayer player= new CharacterPlayer('浩'); player.loop(10); } } プログラミング第12回
実行例 浩浩浩浩浩浩浩浩浩浩 プログラミング第12回
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); } } プログラミング第12回
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); } } プログラミング第12回
課題 • 問題12-4 • 問題12-5 • 余裕があったら,問題12-6 プログラミング第12回