第3章: Javaのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング(OOP)は、Javaの中心的な特徴であり、プログラムの設計に大きな柔軟性と拡張性を提供します。OOPは、実世界の物や概念を「オブジェクト」として扱うことで、より理解しやすいコードの構築を目指します。ここでは、OOPの基本であるクラスとオブジェクト、継承と多態性、カプセル化と抽象化について詳しく解説していきます。


3.1 クラスとオブジェクト

まずは、JavaのOOPで基本となる「クラス」と「オブジェクト」の概念について説明します。クラスはオブジェクトの設計図、オブジェクトはクラスから作られる実体です。

  • クラス: 変数やメソッドを持ち、オブジェクトの構造や動作を定義する「設計図」
  • オブジェクト: クラスをもとに生成され、実際に動作を持つ「実体」
3.1.1 クラスの定義

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 クラスには、次のような構成要素があります。

  • フィールド: nameage という変数で、それぞれ犬の名前と年齢を表します。
  • コンストラクタ: クラスがオブジェクトを生成する際に実行され、nameage を初期化します。
  • メソッド: bark() は犬が吠える動作、showInfo() は犬の情報を表示する動作を定義しています。
3.1.2 オブジェクトの生成と使用

クラスを定義したら、それを使ってオブジェクトを生成できます。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の基本的な流れです。


3.2 継承と多態性

OOPのもう一つの強力な特徴は「継承」と「多態性」です。継承により既存のクラス(スーパークラス)から新しいクラス(サブクラス)を作成できます。また、多態性により、サブクラスがスーパークラスの動作を独自に定義し、異なる振る舞いを持つことが可能です。

3.2.1 継承

継承は「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 クラスがスーパークラスとなり、DogCat クラスがそれを継承しています。makeSound() メソッドをオーバーライドすることで、動物ごとに異なる鳴き声を出すことができます。

3.2.2 多態性

多態性(ポリモーフィズム)とは、同じメソッドを異なる形で実行できる性質です。スーパークラスの参照型でサブクラスのオブジェクトを扱うことができ、同じメソッドを呼び出してもオブジェクトごとに異なる動作が行われます。

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 配列に DogCat のオブジェクトが格納されており、makeSound() メソッドを呼び出すと、それぞれのクラスの実装に基づいて動作します。これは、多様なオブジェクトが同じメソッドを持ちつつも異なる振る舞いをする例です。


3.3 カプセル化と抽象化

カプセル化と抽象化は、コードをより安全で効率的に保つためのOOPの重要な概念です。カプセル化により、データの保護とアクセス管理が可能になり、抽象化により、複雑なシステムの中核的な部分だけを見せ、他の詳細は隠蔽します。

3.3.1 カプセル化

カプセル化とは、クラス内のデータ(フィールド)やメソッドに対してアクセス制限を設けることです。通常、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("残高不足です");
}
}
}

この例では、balanceaccountNumberprivate としてカプセル化され、直接アクセスできないようにしています。これにより、外部からの不正な操作や誤操作が防げます。

3.3.2 抽象化

抽象化は、システムの複雑さを隠すために使われ、重要な部分だけを提供し、詳細をユーザーから隠す手法です。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() という抽象メソッドが含まれています。抽象クラスは、完全な実装を持たないメソッドを定義できるため、サブクラスは必ずこれをオーバーライドし、特定の形状に応じた面積計算を実装します。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

p-school

Recent Posts

第6章: PHPのデータベース操作

PHPを使用してデータベースに…

2週間 ago

第5章: PHPのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング…

2週間 ago

第4章: PHPの関数

プログラミングにおいて、関数は…

2週間 ago

第3章: PHPの配列とコレクション

PHPでの配列とコレクションの…

2週間 ago

第2章: PHPの基本文法

PHPの基本的な構文や使い方を…

2週間 ago