80 likes | 143 Views
class A { ・・・ }. オブジェクト指向の重要な概念 継承(拡張、スーパークラス、サブクラス) 継承される側をスーパークラス(親クラス、上位クラス)、 継承する側をサブクラス(子クラス、下位クラス)と言う。. すべての性質を そのまま引き継ぐ. 第 10 回 Java 実習 (2009/11/27). class B extend A{ ... }. ・性質 ①サブクラスは、上位クラスで定義されている変数やメソッドをすべて引き継ぐ。 ②サブクラスにて、さらに新しく変数やメソッドを追加することができる。
E N D
class A { ・・・ } オブジェクト指向の重要な概念 継承(拡張、スーパークラス、サブクラス) 継承される側をスーパークラス(親クラス、上位クラス)、 継承する側をサブクラス(子クラス、下位クラス)と言う。 すべての性質を そのまま引き継ぐ 第10回 Java実習 (2009/11/27) class B extend A{ ... } ・性質 ①サブクラスは、上位クラスで定義されている変数やメソッドをすべて引き継ぐ。 ②サブクラスにて、さらに新しく変数やメソッドを追加することができる。 ③スーパークラスから引き継ぎたくないメソッドがあれば、サブクラスにて書き換えることができる。 (オーバーライドすることができる。) ・メリット ①スーパークラスを維持しながら、改良したクラスを作成することができる。 継承:一般的に「継承(Inheritance)」というが、Javaでは拡張(extend)と言う。
public class Human { private String name; private String birth; private String adress; Human(String s1, String s2, String s3){ name = s1; birth = s2; adress = s3; } public void show(){ System.out.println("名前:"+ name); System.out.println(" 生年月日:"+ birth); System.out.println(" 住所:"+ adress); } } class Student extends Human { private String dept; private String sNo; Student(String s1, String s2, String s3, String s4, String s5){ super(s1, s2, s3); dept = s4; sNo = s5; } public void show(){ System.out.println("名前:"+ name); System.out.println(" 生年月日:"+ birth); System.out.println(" 住所:"+ adress); System.out.println(" 学部:"+ dept); System.out.println(" 学籍番号:"+ sNo); } } Human.java 第10回 Java実習 (2009/11/27) (1)Studentクラスのメンバ変数は、 スーパークラスから継承した3つと 新規に追加した2つの変数、計5つ 保有する。 (2)スーパークラスから継承したメソッド show( )を上書きしている。 (オーバーライド) (3)superの使い方 (a)上位クラスのコンストラクタを 実行したい時 super(・・・) (b)上位クラスのメソッドを使いたい時 super.メソッド名(・・・) (c)上位クラスの変数を使いたい時 super.変数名
第10回 Java実習 (2009/11/27) Hoge.java public class Hoge{ public static void main(String[] args){ Human hhh = new Human("高木", "1991/11/3", "兵庫県"); Student sss = new Student("池田", "1990/4/6", "京都府"); Student ttt = new Student("内山", "1992/7/13", "京都府", "総合情報学部", "290230"); hhh.show(); sss.show(); ttt.show(); } }
第10回 Java実習 (2009/11/27) 問題10-1 先のプログラム(human.javaとHoge.java)は2箇所間違いがある。 コンパエラーが3箇所と1箇所、合計4箇所でる。 エラーメッセージをよく読んで正しいプログラムに修正しなさい。 (ヒント1) (ヒント2) コンストラクターを追加する。
第10回 Java実習 (2009/11/27) 問題10-2RemConSampleクラスの大改造 これまでのところ、ロボットや風船などの描画処理は、RemConSampleクラスのメソッド(DrawUpRobot等)で行っている。 しかし、オブジェクト指向的な考え方では、これらの描画処理は、 各クラスが自ら行う方がより望ましい。クラスは極力自立する方がよい。 従って、RemConSamleクラスでの各メソッドで行ってることを、各々のクラスのshowメソッドに行うように変更しなさい。 drawObstracle1(・・・)メソッド -> Obstracleクラスのshow(・・・)メソッドに drawObstracle2(・・・)メソッド -> Obstracleクラスのshow(・・・)メソッドに 障害物の数だけメソッドが必要だったが、このようにすることでメソッドは1つになる。 drawBalloon1(・・・)メソッド -> Balloonクラスのshow(・・・)メソッドに drawBalloon2(・・・)メソッド -> Balloonクラスのshow(・・・)メソッドに 風船の数だけメソッドが必要だったが、このようにすることでメソッドは1つになる。 drawUpRobot(・・・)、drawDownRobot(・・・) -> SimpleRobotクラスのshow(・・・)メソッドに
第10回 Java実習 (2009/11/27) import java.awt.*; import javax.swing.*; public class RemConSample extends JPanel{ static int step = 50; //1歩の距離 static int start = 800; //スタート地点のX座標 static Image img = null; static SimpleRobot pochi; static Obstracle obs1; static Obstracle obs2; static Balloon bal1; static Balloon bal2; public static void main(String[] arg){ (省略) } RemConSample(){ (省略) } public void paintComponent(Graphics g){ super.paintComponent(g); pochi.show(g, start, step); obs1.show(g, start, step); obs2.show(g, start, step); bal1.show(g, start, step); //風船1を描く bal2.show(g, start, step); //風船2を描く drawMyFig(g,img); // その他図形(自由課題) } private void drawMyFig(Graphics g, Image im){ (省略) } } 描画メソッドが無くなるために 左のようにシンプルなクラスとなる。 paintComponentメソッドでは、描画の Showメソッドを呼び出すだけとなって いることに注意。 ロボットが起きているかどうか、風船が 割れているかどうかは、このクラスで 判断することは辞め、 各クラスに任せている。 但し、showメソッドの引数に、 g: Graphicsインスタンス Start , stepを渡していることに注意。 また、これまでRemComSampleクラスで 定義していた変数が、各クラスに 移っていることに注意。
第10回 Java実習 (2009/11/27) (ヒント1)かなりの量の変更なので一気に変更するとかえって時間がかかるので、簡単なもの(障害物) から、徐々に行っていく。 下記はまず障害物の描画を改良した例。 class Obstracle{ static int obsWidth = 5; //障害物の幅 static int obsHeight =200; //障害物の高さ(長さ) (省略) public void show(Graphics g, int start, int step){ int pos; pos = getPosition(); g.setColor(Color.green); g.fillRect(start - obsWidth - (pos * step), 0, obsWidth, obsHeight); g.setColor(Color.black); } RemConSampleクラスで定義してた変数 drawObstracle1,2メソッド で定義してた処理 上記に変更に伴なって、RemConSampleクラスでの呼び出し方も下記のように変わる。 public void paintComponent(Graphics g){ super.paintComponent(g); (省略) obs1.show(g, start, step); obs2.show(g, start, step); (省略) }
第10回 Java実習 (2009/11/27) (注) 障害物、ロボット、風船クラスでグラフィッククラスを利用するので、ファイルの先頭に、 import文が必要。(RemConSample.javaと同様) import java.awt.*; import javax.swing.*; (省略)