オブジェクト指向

クラスとインスタンスを示し、重要な3大要素を示す。

1.クラス

 クラスは「設計図」と言われ
   抽象的な「概念」を指す

   分からない言葉を分からない言葉で説明されても理解できない
   「仕様書」、「説明書」と読み替えてみる
 クラスは「設計図」と言われ
   抽象的な「概念」を指す

   分からない言葉を分からない言葉で説明されても理解できない
   「仕様書」、「説明書」と読み替えてみる

 クラスの例を2つ挙げる(House、Human)

class House {
    // 属性
    String layout;   // 間取り
    int floors;      // 階層
    String wallColor; // 壁の色
    String construction; // 造り

    // 各種メソッドがここへ
}

class Human {
    // 属性
    String name;   // 氏名
    int age;      // 年齢
    String gender; // 性別
    
    // 各種メソッドがここへ
}

2.インスタンス

 インスタンスは「実体」と言われ
   具体的な「モノ」を指す

   分からない言葉を分からない言葉で説明されても理解できない
   「データ」、「プログラム」と読み替えてみる

 インスタンスの例を2つ挙げる(House、Human)

House
間取り:2LDK
階層:2階建て
壁の色:白系統
造り:鉄筋コンクリート造


Human
山田さん(23歳男性)
田中さん(50歳女性)
佐藤さん(2歳男の子)

3.継承

 オブジェクト思考の1/3の要素
   あるクラスを引き継いで、新しいクラスを作成すること

 継承の例
   底辺と高さの2つの属性を持つ図形
   Figureクラスを示す
     面積を求めるcalcAreaメソッドを定義している

public abstract class Figure{
    private int teihen;
    private int takasa;

    public abstract int calcArea();
}

 calcAreaメソッドの中身
   戻り値の型とメソッド名のみを定義する抽象メソッド
   抽象メソッドを持つクラスを抽象クラス(abstract)という

 次に四角形・三角形のクラスを示す

// 四角形(Rectangle)
public class Rectangle extends Figure{
    @Override 
    public int calcArea(){
        return this.teihen * this.takasa;
    }
}

// 三角形(Triangle)
public class Triangle extends Figure{
    @Override 
    public int calcArea(){
        return this.teihen * this.takasa / 2;
    }
}

 Figureクラスを継承することで、
   Figureの派生版クラスRectangleとTriangleを実装する
   親:Figure、子:Rectangle,Triangle

 calcAreaメソッドの中身
   三角形と四角形での面積を求める公式は異なるため
     Figureではメソッドの枠組みだけ提供
     継承先で親クラスのメソッドを上書き(Override)する

 実際の使用例

Rectangle rect = new Rectangle();
rect.teihen = 3;
rect.takasa = 4;
System.out.println(rect.calcArea());// 12が表示される

Triangle tri = new Triangle();
tri.teihen = 4;
tri.takasa = 5;
System.out.println(tri.calcArea());// 10が表示される

4.カプセル化

 オブジェクト思考の1/3の要素
   オブジェクトの持つ変数などを隠蔽すること
     変数などの値を参照・更新できる範囲を定義すること
 
 Humanクラスが定義されている時

public class Human {
    // 属性
    public String name;   // 氏名
    private int age;      // 年齢
    public String gender; // 性別

    //コンストラクタ
    public Human(String name, int age, String gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
}
public class Main{
    public static void main(String[] args){
        //Humanクラスのインスタンスを生成
        Human tanaka = new Human("田中", 30, "男");

        //できることは
        tanaka.name = "佐藤";
        //できないことは
        tanaka.age = 50;
    }
}

 Humanクラスにおけるカプセル化(隠蔽)の例
   ’name’はpublicで定義されているため、外部のクラスから参照・変更が可能
   ’age’はprivateで定義されているため、自クラスからのみアクセス可能

5.多態性(polymorphism)

 オブジェクト思考の1/3の要素
   メソッドの呼び出しに対して、
     オブジェクト毎に異なる機能や動作をすること

     ’多’くの 振る舞い(’態’) を持つ ‘性’質 と考える

 例題(抽象クラスが1つ、継承クラスが2つ)

public abstract class Animal{
    public abstract void bark();
}

public class Dog extends Animal{
    public void bark(){
        System.out.println("わん!");
    }
}

public class Cat extends Animal{
    public void bark(){
        System.out.println("にゃー!");
    }
}

 これを動かす

public class Main{
    public static void main(String[] args){
        //Animalの子クラスをインスタンス化
        Dog dog = new Dog();
        Cat cat = new Cat();

        //listに格納
        List<Animal> animals = new ArrayList<Animal>();
        animals.add(dog);
        animals.add(cat);

        //それぞれ鳴かせる           \わん!/   \にゃー!/
        animals.forEach(animal -> animal.bark());
    }
}

 繰り返し文(forEach)で各インスタンスのbarkメソッドを呼ぶ
   犬と猫ごとに違う鳴き声を発する