オブジェクト指向プログラミング(OOP)は、Javaの中心的な特徴であり、プログラムの設計に大きな柔軟性と拡張性を提供します。OOPは、実世界の物や概念を「オブジェクト」として扱うことで、より理解しやすいコードの構築を目指します。ここでは、OOPの基本であるクラスとオブジェクト、継承と多態性、カプセル化と抽象化について詳しく解説していきます。
まずは、JavaのOOPで基本となる「クラス」と「オブジェクト」の概念について説明します。クラスはオブジェクトの設計図、オブジェクトはクラスから作られる実体です。
Javaでは、クラスは class
キーワードを使って定義します。例えば、以下のような「犬(Dog)」というクラスを定義する例を見てみましょう。
public class Dog {
// フィールド(属性)
private String name;
private int age;
// コンストラクタ
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
// メソッド(動作)
public void bark() {
System.out.println(name + "が吠えました!");
}
public void showInfo() {
System.out.println("犬の名前: " + name + ", 年齢: " + age + "歳");
}
}
上記の Dog
クラスには、次のような構成要素があります。
name
と age
という変数で、それぞれ犬の名前と年齢を表します。name
と age
を初期化します。bark()
は犬が吠える動作、showInfo()
は犬の情報を表示する動作を定義しています。クラスを定義したら、それを使ってオブジェクトを生成できます。Javaでオブジェクトを生成するには new
キーワードを使います。
public class Main {
public static void main(String[] args) {
// Dogクラスのオブジェクトを生成
Dog myDog = new Dog("ポチ", 3);
// オブジェクトのメソッドを呼び出す
myDog.bark();
myDog.showInfo();
}
}
この例では、Dog
クラスのオブジェクト myDog
を生成し、bark()
と showInfo()
メソッドを呼び出して、犬が吠えたり情報を表示したりしています。オブジェクトを使ってデータを操作し、動作させることが、OOPの基本的な流れです。
OOPのもう一つの強力な特徴は「継承」と「多態性」です。継承により既存のクラス(スーパークラス)から新しいクラス(サブクラス)を作成できます。また、多態性により、サブクラスがスーパークラスの動作を独自に定義し、異なる振る舞いを持つことが可能です。
継承は「is-a」関係を表し、共通の性質を持つクラス同士でコードの再利用ができます。Javaでは、extends
キーワードを使って継承を実現します。
次に、「動物(Animal)」というスーパークラスと、「犬(Dog)」と「猫(Cat)」というサブクラスの例を見てみましょう。
// スーパークラス
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void makeSound() {
System.out.println("動物の音がします。");
}
public String getName() {
return name;
}
}
// サブクラス: Dog
public class Dog extends Animal {
public Dog(String name) {
super(name); // スーパークラスのコンストラクタを呼び出し
}
@Override
public void makeSound() {
System.out.println(getName() + "がワンワンと吠えました!");
}
}
// サブクラス: Cat
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(getName() + "がニャーニャーと鳴きました!");
}
}
この例では、Animal
クラスがスーパークラスとなり、Dog
と Cat
クラスがそれを継承しています。makeSound()
メソッドをオーバーライドすることで、動物ごとに異なる鳴き声を出すことができます。
多態性(ポリモーフィズム)とは、同じメソッドを異なる形で実行できる性質です。スーパークラスの参照型でサブクラスのオブジェクトを扱うことができ、同じメソッドを呼び出してもオブジェクトごとに異なる動作が行われます。
public class Main {
public static void main(String[] args) {
// Animal型の配列にDogとCatのオブジェクトを格納
Animal[] animals = {new Dog("ポチ"), new Cat("ミケ")};
// 各オブジェクトのmakeSound()メソッドを呼び出し
for (Animal animal : animals) {
animal.makeSound();
}
}
}
このコードでは、animals
配列に Dog
と Cat
のオブジェクトが格納されており、makeSound()
メソッドを呼び出すと、それぞれのクラスの実装に基づいて動作します。これは、多様なオブジェクトが同じメソッドを持ちつつも異なる振る舞いをする例です。
カプセル化と抽象化は、コードをより安全で効率的に保つためのOOPの重要な概念です。カプセル化により、データの保護とアクセス管理が可能になり、抽象化により、複雑なシステムの中核的な部分だけを見せ、他の詳細は隠蔽します。
カプセル化とは、クラス内のデータ(フィールド)やメソッドに対してアクセス制限を設けることです。通常、private
アクセス修飾子を使ってフィールドを隠蔽し、必要に応じて public
なゲッター・セッターメソッドを提供します。
public class Account {
private String accountNumber;
private double balance;
public Account(String accountNumber, double balance) {
this.accountNumber = accountNumber;
this.balance = balance;
}
public String getAccountNumber() {
return accountNumber;
}
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("入金完了: " + amount + "円");
}
}
public void withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
System.out.println("出金完了: " + amount + "円");
} else {
System.out.println("残高不足です");
}
}
}
この例では、balance
と accountNumber
は private
としてカプセル化され、直接アクセスできないようにしています。これにより、外部からの不正な操作や誤操作が防げます。
抽象化は、システムの複雑さを隠すために使われ、重要な部分だけを提供し、詳細をユーザーから隠す手法です。Javaでは、abstract
キーワードを使って抽象クラスを定義することで実現します。
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract double calculateArea(); // 抽象メソッド
public String getColor() {
return color;
}
}
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
ここでは、Shape
クラスが抽象クラスとして定義されており、calculateArea()
という抽象メソッドが含まれています。抽象クラスは、完全な実装を持たないメソッドを定義できるため、サブクラスは必ずこれをオーバーライドし、特定の形状に応じた面積計算を実装します。
プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。
独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。
プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:
どちらが自分に合っているか、よく考えて選ぶのが大事です。
プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:
なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。
カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。
独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
↓ ↓ こちらをクリック ↓ ↓