オブジェクト指向とは
オブジェクト指向プログラミング (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
クラスはこれらのオブジェクトを操作するエントリーポイントとなっています。 -
-
コメント