Javaを基礎から学ぶその9　オブジェクト指向:多態性、カプセル化

この記事は[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の9日目の記事です
# 多態性（ポリモーフィズム）とは
ほかに多様性や多相性と呼ばれています。
「同じようなものを大まかにとらえて、一つのものとみなす」ことのようです。
### 例) 動物と羊、サル、鳥の関係
各クラスの羊、サル、鳥を大まかに「動物」ととらえて、一つのものとみなしています。
そして各クラスで行われる動物たちの食事をひとつにまとめています。
```
public class B {
    public static void main(String[] args){
        Animal[] Doubutu =  {new Sheep(), new Monkey(), new Bird(),new Doubutu()};
        for(Animal syokuji:Doubutu){
        syokuji.eat();
        }
    }
   

}
class Animal {
    public void eat()
     { 
        System.out.println("Animals eat");
     }
  }
  class Sheep extends Animal{
    public void eat(){
        System.out.println("Sheep eat");
    }
  
  }
  class Monkey extends Animal{
    public void eat(){
        System.out.println("Monkey eat");
    }
  
  }
  class Bird extends Animal{
    public void eat(){
        System.out.println("Bird eat");
    }
  
  }
```
これを実行すると、
```
Sheep eat
Monkey eat
Bird eat
Animals eat
```
となります
### 解説
```
class Animal {
    public void eat()
     { 
        System.out.println("Animals eat");
     }
  }
  class Sheep extends Animal{
    public void eat(){
        System.out.println("Sheep eat");
    }
  
  }
  class Monkey extends Animal{
    public void eat(){
        System.out.println("Monkey eat");
    }
  
  }
  class Bird extends Animal{
    public void eat(){
        System.out.println("Bird eat");
    }
  
  }
```
それぞれの動物がクラスごとに分かれています。羊、サル、鳥はどれも親クラスがAnimalです。それぞれのクラス内には、動物ごとに異なる食事の文が書かれています。
```
 Animal[] Doubutu =  {new Sheep(), new Monkey(), new Bird(),new Doubutu()};
```
それぞれの動物(羊、サル、鳥)を、「動物」として大きくとらえてDoubutuとしています。ちなみに、イコールの右側に書くことができるのはAnimalの親クラスまたは子クラスです。親子関係のないものを入れるとエラーが出ます。エラーの内容は下に載せました
```
B.java:3: エラー: 不適合な型: SheepをAnimalに変換できません:
```
こんなエラーが出ます。
```
   for(Animal syokuji:Doubutu){
        syokuji.eat();
        }
```
動物としてざっくりひとまとめにしたので、こんなに簡潔に書くことができます。
ちなみに、一つにまとめる部分は配列としてまとまっているので以下のように書くことも可能です。
```
 Animal[] Doubutu = new Animal[4];
        Doubutu[0]=new Animal();
        Doubutu[1]=new Sheep();
        Doubutu[2]=new Monkey();
        Doubutu[3]=new Bird();
```
同じように動かすことができます。

これが多態性みたいです。


# カプセル化とは
他からのアクセスを制限（アクセス制御）することにより、適切でない操作を防ぐことで保守性の向上につなげられるものです。
### 例) 重要な情報
```
public class E{
    public static void main(String[] args){
        F f=new F();
        f.TEST();

    }
}
class F{
    public String S = "Important information";
    public void TEST(){
        System.out.println(S);
    }
}
```
class Fの中には"Important information"(重要な情報)が入っています。この段階ではpublicなので、ほかのclassから書き換えることができてしまいます。
試しにclass Eから文字列を書き換えてみます。
```
f.S="Kakikae";
```
これをf.TEST()を行う前にくっつけておきます。すると
```
Kakikae
```
となり、重要な情報が書き換えられてしまっていることがわかります。
### public をstaticに変える
stringのpublicをprivateに変えます。
```
 private String S = "Important information";
```
これで実行しようとすると、
```
E.java:4: エラー: SはFでprivateアクセスされます
        f.S="Kakikae";
         ^
エラー1個
```
コンパイル時にこのようなエラーが出るようになりました。privateになっているものにアクセスすると、エラーが出ます。ちなみに、書き換えなくても参照することなどほかのクラスでprivateなものの名前を出すだけで止まってしまいます。
##### うっかり別のクラスから書き換えてしまうのを防ぐことができます。
## 種類
アクセス制御にも4種類あるようです。
|種類|強さ|
|---|---|
|public|弱い|
|protected|やや弱い|
|無記載|強い|
|private|すごい強い|

こんな感じのようです。同じパッケージにまとめて書いている場合は、private以外は書き換えることができました。

# まとめ
多態性はざっくり1つにまとめていろいろなことができる。
カプセル化はアクセスを制御して間違って書き換えるのを防ぐ。
アクセス制御には4種類あり、それぞれ強さが違う。
# 参考文献

https://magazine.techacademy.jp/magazine/40258

https://jitera.com/ja/insights/44788#:~:text=%E6%8C%87%E5%90%91%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81-,%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

株式会社インプレス,スッキリわかるJava入門 第4版