オブジェクト指向とは
オブジェクト指向プログラミング (OOP) は、プログラムをオブジェクト(物)として捉え、そのオブジェクト同士のやり取りを通じてプログラムを構築する方法で、これにより、コードの再利用性、保守性、拡張性が向上します。
基本概念
クラスとオブジェクト
- クラス: オブジェクトの設計図。プロパティ(属性)とメソッド(動作)を定義します。
- オブジェクト: クラスから作られた実体のことで、クラスのインスタンスとも呼ばれます。
カプセル化
-
-
-
- データとメソッドをクラス内に隠蔽し、オブジェクトの内部状態を外部から隠蔽し、オブジェクトのインターフェースを通じてのみアクセスできるようにする概念です。
- プロパティは通常、
privateにして、アクセス用のメソッド(ゲッターやセッター)を通じて操作します。 - アクセス修飾子は (public, private)です。この記事では、2つのアクセス装飾子を紹介しましたが、それぞれの特性を知りたい方はJavaのアクセス装飾子のまとめをご覧になってください。
継承
- 既存のクラスを基に、子クラスを作成し、新しいクラスは既存のクラスのプロパティとメソッドを継承(extends)します。
ポリモーフィズム(多態性)
- 同じメソッド名でも、異なるクラスで異なる実装を持つことができる機能で、オブジェクトを統一的に扱うことができ主に主にメソッドのオーバーライドによって実現されます。
抽象化
抽象化は、具体的な詳細を隠し、重要な情報のみを表現することです。抽象クラスやインターフェースを使って実現します。
プログラムを例に解説
文章だけでは、理解しにくい部分があると思いますのでプログラムを例に解説していきますね。
このプログラムは、動物を表す抽象クラス
Animalを継承するDogとCatクラスを定義し、それぞれが独自のサウンドを出すメソッドを持っています。メインメソッドでは、これらのオブジェクトを作成し、メソッドを呼び出して動作を確認します。設計図クラス: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メソッドをオーバーライドして「ワン!」という音を出します。また、nameとageのフィールドを持ち、これらのフィールドにアクセスするためのゲッターとセッターを提供しています。
・Catクラス: Animalクラスを継承し、makeSoundメソッドをオーバーライドして「ニャン!」という音を出します。nameとageのフィールドを持ち、これらのフィールドにアクセスするためのゲッターとセッターを提供しています。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クラス: プログラムのエントリーポイントです。
DogとCatのインスタンスを作成し、それぞれのeatメソッドとmakeSoundメソッドを呼び出します。また、DogとCatの名前と年齢を出力します。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): コンストラクタで、nameとageを設定します。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): コンストラクタで、nameとageを設定します。void makeSound(): オーバーライドされたメソッドで、「ニャン!」という音を出します。String getName():nameを取得するセッターメソッド。void setName(String name):nameを設定するセッターメソッド。int getAge():ageを取得するゲッターメソッド。void setAge(int age):ageを設定するセッターメソッド。
Main クラス
- メソッド:
static void main(String[] args): エントリーポイントメソッド。DogとCatのオブジェクトを作成し、それぞれのeatとmakeSoundメソッドを呼び出し、名前と年齢を出力します。
クラス間の関係
- 継承:
DogクラスとCatクラスはAnimalクラスを継承しています(extends)。
- インスタンス生成:
MainクラスはDogクラスとCatクラスのインスタンスを生成しています(creates)。
まとめ
このクラスは、オブジェクト指向プログラミングの基本概念を視覚的に示しています。
Animalクラスが抽象クラスとして定義され、そのサブクラスであるDogとCatが具体的な実装を持っています。Mainクラスはこれらのオブジェクトを操作するエントリーポイントとなっています。 -
-
コメント