初心者必見!Javaのオブジェクト指向プログラミングの基本概念を学ぼう

スポンサーリンク
この記事は約9分で読めます。

オブジェクト指向とは

オブジェクト指向プログラミング (OOP) は、プログラムをオブジェクト(物)として捉え、そのオブジェクト同士のやり取りを通じてプログラムを構築する方法で、これにより、コードの再利用性、保守性、拡張性が向上します。

基本概念

クラスとオブジェクト

  • クラス: オブジェクトの設計図。プロパティ(属性)とメソッド(動作)を定義します。
  • オブジェクト: クラスから作られた実体のことで、クラスのインスタンスとも呼ばれます。

カプセル化

        • データとメソッドをクラス内に隠蔽し、オブジェクトの内部状態を外部から隠蔽し、オブジェクトのインターフェースを通じてのみアクセスできるようにする概念です。
        • プロパティは通常、private にして、アクセス用のメソッド(ゲッターやセッター)を通じて操作します。
        • アクセス修飾子は (public, private)です。この記事では、2つのアクセス装飾子を紹介しましたが、それぞれの特性を知りたい方はJavaのアクセス装飾子のまとめをご覧になってください。

      継承

      • 既存のクラスを基に、子クラスを作成し、新しいクラスは既存のクラスのプロパティとメソッドを継承(extends)します。

      ポリモーフィズム(多態性)

      • 同じメソッド名でも、異なるクラスで異なる実装を持つことができる機能で、オブジェクトを統一的に扱うことができ主に主にメソッドのオーバーライドによって実現されます。

      抽象化

      抽象化は、具体的な詳細を隠し、重要な情報のみを表現することです。抽象クラスやインターフェースを使って実現します。

      プログラムを例に解説

      文章だけでは、理解しにくい部分があると思いますのでプログラムを例に解説していきますね。

      このプログラムは、動物を表す抽象クラス Animal を継承する DogCat クラスを定義し、それぞれが独自のサウンドを出すメソッドを持っています。メインメソッドでは、これらのオブジェクトを作成し、メソッドを呼び出して動作を確認します。

      設計図クラス:aminal

      Animalクラス: 抽象クラスで、makeSound という抽象メソッドと eat という具体的なメソッドを持っています。eat メソッドは、最初の呼び出し時にのみメッセージを表示します。

      package animal;
      
      abstract class Animal {
      	
      	private static boolean isCalled = false;
      	
          abstract void makeSound();
          void eat() {
          	if (!isCalled) {
          		System.out.println("美味しそうに食事をしていますね!何の動物かな?");
          		isCalled = true;
          	}
          }
      }

      設計図クラス:Dog、Cat

      Dogクラス: Animalクラスを継承し、makeSound メソッドをオーバーライドして「ワン!」という音を出します。また、nameage のフィールドを持ち、これらのフィールドにアクセスするためのゲッターとセッターを提供しています。
      ・Catクラス: Animalクラスを継承し、makeSound メソッドをオーバーライドして「ニャン!」という音を出します。nameage のフィールドを持ち、これらのフィールドにアクセスするためのゲッターとセッターを提供しています。

      Dog クラス

      package animal;
      
      class Dog extends Animal {
      private String name;
      private int age;
      
      public Dog(String name, int age) {
      this.name = name;
      this.setAge(age);
      }
      
      @Override
      void makeSound() {
      System.out.print("\n" + "ワン!");
      }
      
      public String getName() {
      return name;
      }
      
      public void setName(String name) {
      this.name = name;
      }
      
      public int getAge() {
      return age;
      }
      
      public void setAge(int age) {
      this.age = age;
      }
      }

      Cat クラス

      package animal;
      
      class Cat extends Animal {
      private String name;
      private int age;
      
      public Cat(String name, int age) {
      this.name = name;
      this.setAge(age);
      }
      
      @Override
      void makeSound() {
      System.out.println("ニャン!");
      }
      
      public String getName() {
      return name;
      }
      
      public void setName(String name) {
      this.name = name;
      }
      
      public int getAge() {
      return age;
      }
      
      public void setAge(int age) {
      this.age = age;
      }
      }
      

      実行クラス:Main

      Mainクラス: プログラムのエントリーポイントです。DogCat のインスタンスを作成し、それぞれの eat メソッドと makeSound メソッドを呼び出します。また、DogCat の名前と年齢を出力します。

      package animal;
      
      public class Main {
          public static void main(String[] args) {
              Dog myDog = new Dog("Rex", 5);
              Cat myCat = new Cat("Momo", 3);
      
              myDog.eat();         // スーパークラスのメソッドを呼び出す
              myDog.makeSound();   // オーバーライドされたサブクラスのメソッドを呼び出す
              
              myCat.eat();         // スーパークラスのメソッドを呼び出す
              myCat.makeSound();   // オーバーライドされたサブクラスのメソッドを呼び出す
              
              System.out.println("\n" + "犬の名前は:" + myDog.getName() );
              System.out.println(myDog.getName() + "の年齢は:" + myDog.getAge() + "才");
              System.out.println("\n" + "猫の名前は:" + myCat.getName() );
              System.out.println(myCat.getName() + "の年齢は:" + myCat.getAge() + "才");
              
          }
      }

      実行結果

      • それぞれの eat メソッドを呼び出して、最初に「美味しそうに食事をしていますね!何の動物かな?」というメッセージを表示します。
      • それぞれの makeSound メソッドを呼び出して、犬は「ワン!」、猫は「ニャン!」という音を出します。
      • 犬と猫の名前と年齢を出力します。
      美味しそうに食事をしていますね!何の動物かな?
      
      ワン!ニャン!
      
      犬の名前は:Rex
      Rexの年齢は:5才
      
      猫の名前は:Momo
      Momoの年齢は:3才
      

      クラスの構成

      Animal クラス

      • 属性:
        • isCalled: boolean 型の静的プライベート変数。食事メソッドが最初に呼び出されたかどうかを記録するために使用されます。
      • メソッド:
        • abstract void makeSound(): 抽象メソッドで、具体的なサブクラスで実装されます。
        • void eat(): 食事のメッセージを一度だけ表示するメソッド。

      Dog クラス(Animal を継承)

      • 属性:
        • name: String 型のプライベート変数。犬の名前を保持します。
        • age: int 型のプライベート変数。犬の年齢を保持します。
      • メソッド:
        • Dog(String name, int age): コンストラクタで、nameage を設定します。
        • void makeSound(): オーバーライドされたメソッドで、「ワン!」という音を出します。
        • String getName(): name を取得するゲッターメソッド。
        • void setName(String name): name を設定するセッターメソッド。
        • int getAge(): age を取得するゲッターメソッド。
        • void setAge(int age): age を設定するセッターメソッド。

      Cat クラス(Animal を継承)

      • 属性:
        • name: String 型のプライベート変数。猫の名前を保持します。
        • age: int 型のプライベート変数。猫の年齢を保持します。
      • メソッド:
        • Cat(String name, int age): コンストラクタで、nameage を設定します。
        • void makeSound(): オーバーライドされたメソッドで、「ニャン!」という音を出します。
        • String getName(): name を取得するセッターメソッド。
        • void setName(String name): name を設定するセッターメソッド。
        • int getAge(): age を取得するゲッターメソッド。
        • void setAge(int age): age を設定するセッターメソッド。

      Main クラス

      • メソッド:
        • static void main(String[] args): エントリーポイントメソッド。DogCat のオブジェクトを作成し、それぞれの eatmakeSound メソッドを呼び出し、名前と年齢を出力します。

      クラス間の関係

      • 継承:
        • Dog クラスと Cat クラスは Animal クラスを継承しています(extends)。
      • インスタンス生成:
        • Main クラスは Dog クラスと Cat クラスのインスタンスを生成しています(creates)。

      まとめ

      このクラスは、オブジェクト指向プログラミングの基本概念を視覚的に示しています。Animal クラスが抽象クラスとして定義され、そのサブクラスである DogCat が具体的な実装を持っています。Main クラスはこれらのオブジェクトを操作するエントリーポイントとなっています。

      にほんブログ村 IT技術ブログ IT技術メモへ

コメント

タイトルとURLをコピーしました