1. 概要

この記事では、Javaのオブジェクト指向プログラミング(OOP)の概念について説明します。 クラス、オブジェクト、抽象化、カプセル化、継承、およびポリモーフィズムについて説明します。

2. クラス

クラスはすべてのオブジェクトの開始点であり、オブジェクトを作成するためのテンプレートと見なすことができます。 クラスには通常、メンバーフィールド、メンバーメソッド、および特別なコンストラクターメソッドが含まれます。

コンストラクターを使用して、クラスのオブジェクトを作成します。

public class Car {
 
    // member fields
    private String type;
    private String model;
    private String color;
    private int speed;
 
    // constructor
    public Car(String type, String model, String color) {
        this.type = type;
        this.model = model;
        this.color = color;
    }
     
    // member methods
    public int increaseSpeed(int increment) {
        this.speed = this.speed + increment;
        return this.speed;
    }
     
    // ...
}

クラスには複数のコンストラクターが含まれる場合があることに注意してください。 クラスの詳細については、クラスの記事をご覧ください。

3. オブジェクト

オブジェクトはクラスから作成され、クラスのインスタンスと呼ばれます。 コンストラクターを使用してクラスからオブジェクトを作成します。

Car veyron = new Car("Bugatti", "Veyron", "crimson");
Car corvette = new Car("Chevrolet", "Corvette", "black");

ここでは、クラスCarの2つのインスタンスを作成しました。これらの詳細については、オブジェクトの記事を参照してください。

4. 抽象化

抽象化とは、実装の複雑さを隠し、より単純なインターフェースを公開することです。

典型的なコンピューターについて考えると、外部インターフェースしか見ることができません。これは、コンピューターと対話するために最も重要であり、内部チップと回路はユーザーから隠されています。

OOPでは、抽象化とは、プログラムの複雑な実装の詳細を非表示にし、実装の使用に必要なAPIのみを公開することを意味します。 Javaでは、インターフェースと抽象クラスを使用して抽象化を実現します。

抽象化の詳細については、抽象クラスおよびインターフェースの記事を参照してください。

5. カプセル化

カプセル化は、APIのコンシューマーからオブジェクトの状態または内部表現を隠し、読み取り/書き込みアクセスのためにオブジェクトにバインドされたパブリックにアクセス可能なメソッドを提供します。 これにより、特定の情報を非表示にし、内部実装へのアクセスを制御できます。

たとえば、クラスのメンバーフィールドは他のクラスから隠されており、メンバーメソッドを使用してアクセスできます。 これを行う1つの方法は、すべてのデータフィールドを private にし、publicメンバーメソッドを使用してのみアクセスできるようにすることです。

public class Car {

    // ...
    private int speed;

    public int getSpeed() {
        return color;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
    // ...
}

ここで、フィールド speed は、 private access修飾子を使用してカプセル化され、 public getSpeed()および setSpeed()[ X172X]メソッド。 アクセス修飾子の詳細については、アクセス修飾子の記事を参照してください。

6. 継承

継承は、あるクラスがクラスを継承することにより、別のクラスからすべてのプロパティを取得できるようにするメカニズムです。継承クラスを子クラスと呼び、継承クラスをスーパークラスまたは親クラスと呼びます。

Javaでは、親クラスを拡張することでこれを行います。 したがって、子クラスは親からすべてのプロパティを取得します。

public class Car extends Vehicle { 
    //...
}

クラスを拡張すると、IS-A関係が形成されます。 車は車です。 だから、それはのすべての特徴を持っています車両

なぜ継承が必要なのかという質問をするかもしれません。 これに答えるために、自動車、バス、路面電車、トラックなど、さまざまな種類の車両を製造している自動車メーカーについて考えてみましょう。

作業を簡単にするために、すべての車両タイプの共通の機能とプロパティをモジュール(Javaの場合はクラス)にバンドルできます。 そして、個々のタイプにそれらのプロパティを継承させて再利用させることができます。

public class Vehicle {
    private int wheels;
    private String model;
    public void start() {
        // the process of starting the vehicle
    }
    
    public void stop() {
        // process to stop the vehicle
    }
    
    public void honk() { 
        // produces a default honk 
    }

}

車両タイプCarは、親Vehicleクラスから継承されます。

public class Car extends Vehicle {
    private int numberOfGears;

    public void openDoors() {
        // process to open the doors
    }
}

Javaは、単一継承とマルチレベル継承をサポートしています。 つまり、クラスは複数のクラスから直接拡張することはできませんが、階層を使用することはできます。

public class ArmoredCar extends Car {
    private boolean bulletProofWindows;
    
    public void remoteStartCar() {
        // this vehicle can be started by using a remote control
    }
}

ここで、ArmouredCarCarを拡張し、CarVehicleを拡張します。 したがって、 ArmouredCar は、CarVehicleの両方からプロパティを継承します。

親クラスから継承する一方で、開発者は親からのメソッド実装をオーバーライドすることもできます。 これはメソッドのオーバーライドとして知られています。

上記のVehicleクラスの例には、 honk()メソッドがあります。 Vehicleクラスを拡張するCarクラスは、このメソッドをオーバーライドして、ホーンを生成する方法で実装できます。

public class Car extends Vehicle {  
    //...

    @Override
    public void honk() { 
        // produces car-specific honk 
    }
 }

次のセクションで説明するように、これはランタイムポリモーフィズムとも呼ばれることに注意してください。 継承の詳細については、Java継承および継承と構成の記事を参照してください。

7. ポリモーフィズム

ポリモーフィズムは、入力のタイプに応じてデータを異なる方法で処理するOOP言語の機能です。 Javaでは、これは、異なるメソッドシグネチャを持ち、異なる機能を実行する同じメソッド名にすることができます。

public class TextFile extends GenericFile {
    //...
 
    public String read() {
        return this.getContent()
          .toString();
    }
 
    public String read(int limit) {
        return this.getContent()
          .toString()
          .substring(0, limit);
    }
 
    public String read(int start, int stop) {
        return this.getContent()
          .toString()
          .substring(start, stop);
    }
}

この例では、メソッド read()が異なる機能を持つ3つの異なる形式を持っていることがわかります。 このタイプのポリモーフィズムは静的またはコンパイル時のポリモーフィズムであり、メソッドのオーバーロードとも呼ばれます。

ランタイムまたは動的ポリモーフィズムもあり、子クラスが親のメソッドをオーバーライドします。

public class GenericFile {
    private String name;
 
    //...
 
    public String getFileInfo() {
        return "Generic File Impl";
    }
}

子クラスは、 GenericFile クラスを拡張し、 getFileInfo()メソッドをオーバーライドできます。

public class ImageFile extends GenericFile {
    private int height;
    private int width;
 
    //... getters and setters
     
    public String getFileInfo() {
        return "Image File Impl";
    }
}

ポリモーフィズムの詳細については、Javaでのポリモーフィズムの記事を参照してください。

8. 結論

この記事では、Javaを使用したOOPの基本的な基本概念について学びました。

この記事のコードサンプルは、Githubから入手できます。