オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也
クラスとインスタンスの復習(1/2) クラスはモノの概念,種類. インスタンスは個々のモノ,個体. 人(Person)クラスの作成. public class Person { String name; double height; double weight; double getBMI() { return weight / (height * height); }
クラスとインスタンスの復習(2/2) main()メソッド内で Person クラスのインスタンスを2つ生成する. 1つのクラスに対してインスタンスはいくつでも作成できる. インスタンスの生成×2 public static void main(String[] args) { Person p1 = new Person(); p1.setHeight(1.7); p1.setWeight(65); Person p2 = new Person(); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); System.out.println(bmi1); System.out.println(bmi2); } p1とp2はPersonクラスの 別のインスタンスなので その内容も異なる
オブジェクト指向言語の基本概念 カプセル化 継承 多相性(ポリモルフィズム) データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム)
継承とは? オブジェクト指向プログラミングとはクラスの作成. 新たにクラスを作成する際に,今までに作成したクラスを再利用することによって,クラス作成時のプログラミングの量を減らすこと(差分プログラミング). ただし,差分プログラミングは近年あまり強調されない. 再利用する既存クラスを親クラス,親クラスを再利用して新たに作成するクラスを子クラスという. クラスがモノの概念や種類を表すことから,親クラスはより一般的な概念,子クラスはより特殊な概念を表すと考えればよい.
継承の例(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クラスに 定義されていない ことに注意!
継承がある場合のメソッド呼び出し デバッガを使って追いかけてみる. 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クラスの いずれが呼び出されるか?