Download presentation
Presentation is loading. Please wait.
1
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也
2
構造化指向の問題点 構造化指向(C言語)または構造化指向っぽく書いたオブジェクト指向(Java)のプログラムでは,データ構造の変更に伴って変更すべき箇所が散乱する. public class Main { public static void main(String[] args) { List l = new List(); add(l, 11); add(l, 22); int v = get(l, 1); System.out.println("v = " + v); } public static void add(List l, int v) { l.values[l.size] = v; l.size++; public static void get(List l, int n) { return l.values[n]; public class List { int values[] = new int[1000]; int size; } データ構造の修正 (構造体) アルゴリズムの修正(関数)
3
カプセル化(1/2) それなら,一緒に変更されるデータ構造とアルゴリズムを一箇所にまとめればいい. 構造体 関数を構造体の中に
public class Main { public static void main(String[] args) { List l = new List(); add(l, 11); add(l, 22); int v = get(l, 1); System.out.println("v = " + v); } public static void add(List l, int v) { l.values[l.size] = v; l.size++; public static void get(List l, int n) { return l.values[n]; public class List { int values[] = new int[1000]; int size; } 関数を構造体の中に 入れてしまえばよい 関数
4
カプセル化(2/2) それなら,一緒に変更されるデータ構造とアルゴリズムを一箇所にまとめればいい.
public class Main { public static void main(String[] args) { List l = new List(); l.add(11); l.add(22); int v = l.get(1); System.out.println("v = " + v); } public class List { int values[] = new int[1000]; int size; public void add(int v) { values[size] = v; size++; } public int get(int n) { return values[n]; 構造体 部分 関数部分 構造体と関数をまとめた(カプセル化した)ものをクラスと呼ぶ. クラスの内部にデータ構造とアルゴリズムの両方を隠蔽できる. クラスはモノに相当すると考えよう(オブジェクト指向).
5
フィールドとメソッド オブジェクト指向では,構造体部分の変数を フィールド,関数をメソッドと呼ぶ. public class List {
int values[] = new int[1000]; int size; public void add(int v) { values[size] = v; size++; } public int get(int n) { return values[n]; フィールド メソッド
6
カプセル化に伴う呼び出し側の変更 カプセル化に伴って呼び出し側にも若干の変更が必要. インスタンスの生成
メッセージの送信(メソッド呼び出し) public class Main { public static void main(String[] args) { List l = new List(); l.add(11); l.add(22); int v = l.get(1); System.out.println("v = " + v); } インスタンスの生成 メッセージの送信先インスタンス
7
クラスとインスタンス クラスはモノの概念,種類. インスタンスは個々のモノ,個体. public class Main {
インスタンスの生成×2 public class Main { public static void main(String[] args) { List l = new List(); l.add(11); l.add(22); List l2 = new List(); l2.add(33); l2.add(44); int v1 = l.get(1); int v2 = l2.get(1); System.out.println("v1 = " + v1); System.out.println("v2 = " + v2); } lとl2はListクラスの 別のインスタンスなので その内容も異なる
8
クラスとインスタンスの例(1/2) 人(Person)クラスを作成する. public class Person {
String name; double height; double weight; double getBMI() { return weight / (height * height); }
9
クラスとインスタンスの例(2/2) main()メソッド内で Person クラスのインスタンスを2つ生成する.
1つのクラスに対してインスタンスはいくつでも作成できる. public static void main(String[] args) { Person p1 = new Person(); p1.height = 1.7; p1.weight = 65; Person p2 = new Person(); p2.height = 1.6; p2.weight = 55; double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); System.out.println(bmi1); System.out.println(bmi2); }
10
よりオブジェクト指向っぽく (セッタ,ゲッタの追加)(1/2)
一般にフィールドの値を設定するメソッドをセッタ,値を取得するメソッドをゲッタと呼ぶ. public class Person { String name; double height; double weight; void setHeight(double h) { height = h; } double getHeight() { return height; double getBMI() { return weight / (height * height);
11
よりオブジェクト指向っぽく (セッタ,ゲッタの追加)(2/2)
main()メソッドも以下のように書き換える. 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); }
12
課題提出 課題提出先: http://bit.ly/2qKebNr 講義時間内に提出すること.
提出後に訂正はできないが,講義時間内なら再提出可能. 学籍番号は半角の数字で.
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.