0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaとPythonを基礎から学びたい私のためのAdvent Calendar 2024

Day 9

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

Last updated at Posted at 2024-12-08

この記事はJavaとPythonを基礎から学びたい私のための Advent Calendar 2024の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種類あり、それぞれ強さが違う。

参考文献

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?