オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也
オブジェクト指向言語の基本概念 カプセル化 継承 多相性(ポリモルフィズム) データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム)
継承とは? オブジェクト指向プログラミングとはクラスの作成. 新たにクラスを作成する際に,今までに作成したクラスを再利用することによって,クラス作成時のプログラミングの量を減らすこと(差分プログラミング). ただし,差分プログラミングは近年あまり強調されない. 再利用する既存クラスを親クラス,親クラスを再利用して新たに作成するクラスを子クラスという. クラスがモノの概念や種類を表すことから,親クラスはより一般的な概念,子クラスはより特殊な概念を表すと考えればよい.
継承の例(1/3) Personは「人」を表していた. 人のより特殊な概念として「学生」を考える. public class Student { String name; double height; double weight; String id; // 学籍番号 int grade; // 学年 String getID() { return id; } int getGrade() { return grade; double getBMI() { return weight / (height * height); Person クラスと 共通
継承の例(2/3) extendsを用いて親クラスを拡張して子クラスを作成. 親クラスとの共通部分を省略できるのでクラスの作成を効率化できる. public class Student extends Person { String id; // 学籍番号 int grade; // 学年 String getID() { return id; } int getGrade() { return grade; Person クラスを 拡張して 作成する Person クラスとの 共通部分 は省略
継承の例(3/3) main()メソッド内の書き方は親クラスと同様. インスタンスの生成×2 public static void main(String[] args) { Student p1 = new Student(); p1.setHeight(1.7); p1.setWeight(65); Student p2 = new Student(); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); System.out.println(bmi1); System.out.println(bmi2); } setHeight()と setWeight()は Studentクラスに 定義されていない ことに注意!
継承がある場合のメソッド呼び出し(1/3) デバッガを使って追いかけてみる. public static void main(String[] args) { Student p1 = new Student(); p1.setGrade(1); p1.setHeight(1.7); p1.setWeight(65); Student p2 = new Student(); p2.setGrade(2); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); System.out.println(grade1 + "," + bmi1); System.out.println(grade2 + "," + bmi2); } Personクラスと Studentクラスの いずれが呼び出されるか?
継承がある場合のメソッド呼び出し(2/3) 子クラスにメソッドが定義されていない場合,親クラスのメソッドが代わりに呼ばれる. public static void main(String[] args) { Student p1 = new Student(); p1.setGrade(1); p1.setHeight(1.7); p1.setWeight(65); Student p2 = new Student(); p2.setGrade(2); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); System.out.println(grade1 + "," + bmi1); System.out.println(grade2 + "," + bmi2); } Studentクラス Personクラス (Studentクラスに定義されていないが,親クラスであるPersonクラスに定義されている.)
メソッドのオーバーライド では,親クラスにも子クラスにも同じメソッドが定義されている場合は? このような場合をメソッドのオーバーライドといい子クラス側のメソッドが呼び出される. public class Student extends Person { String id; // 学籍番号 int grade; // 学年 String getID() { return id; } : double getBMI() { return 0.0; オーバーライド (親クラス側で定義されているメソッドを子クラス側でも再定義している)
継承がある場合のメソッド呼び出し(3/3) 親クラスのメソッドを子クラスがオーバーライドしている場合,子クラス側のメソッドが呼ばれる. public static void main(String[] args) { Student p1 = new Student(); p1.setGrade(1); p1.setHeight(1.7); p1.setWeight(65); Student p2 = new Student(); p2.setGrade(2); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); System.out.println(grade1 + "," + bmi1); System.out.println(grade2 + "," + bmi2); } Studentクラス Personクラス (Studentクラスに定義されていないが,親クラスであるPersonクラスに定義されている.) Studentクラス (Personクラスに定義されているメソッドをStudentクラスがオーバーライドしている.)
継承がある場合のメソッド呼び出しのまとめ 子クラス側からみて最初に見つかったメソッドが呼び出される. 親クラス側 子クラス側 Person double height; double weight; double getHeight(); double getWeight(); double getBMI(); Student int grade; double getBMI(); int getGrade();
オブジェクト指向言語の基本概念 カプセル化 継承 多相性(ポリモルフィズム) データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム)
多相性とは? 継承を用いることで,既存クラスを再利用(拡張)して容易に新しいクラスを作成することができる. しかし,作成した新しいクラスはそのままでは実行時に利用されることはない. 新しいクラスが利用されるようにするためには他のクラスも書き換えなければならない. 多相性:拡張に伴う書き換えを最小限にする仕組み. 親クラス 子クラス
課題提出 課題提出先: http://bit.ly/2GcpKYv 講義時間内に提出すること. 提出後に訂正はできないが,講義時間内なら再提出可能. 学籍番号は半角の数字で.