1. 概要

このクイックチュートリアルでは、Javaプログラミング言語の2つの基本的な構成要素であるクラスとオブジェクトについて説明します。 これらは、オブジェクト指向プログラミング(OOP)の基本的な概念であり、実際のエンティティをモデル化するために使用します。

OOPでは、 クラスは、オブジェクトの青写真またはテンプレートです。 それらを使用して、エンティティのタイプを記述します。

一方で、 オブジェクトは、クラスから作成された生きたエンティティです。 それらはフィールド内に特定の状態を含み、それらのメソッドで特定の動作を示します。

2. クラス

簡単に言えば、クラスは定義またはオブジェクトのタイプを表します。 Javaでは、クラスにフィールド、コンストラクター、およびメソッドを含めることができます。

Carを表す単純なJavaクラスを使用した例を見てみましょう。

class Car {

    // fields
    String type;
    String model;
    String color;
    int speed;

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

このJavaクラスは、一般的に車を表します。 このクラスからあらゆるタイプの車を作成できます。 フィールドを使用して状態を保持し、コンストラクターを使用してこのクラスからオブジェクトを作成します。

すべてのJavaクラスには、デフォルトで空のコンストラクタがあります。 上記のように特定の実装を提供しない場合に使用します。 デフォルトのコンストラクターがCarクラスを検索する方法は次のとおりです。

Car(){}

このコンストラクターは、オブジェクトのすべてのフィールドをデフォルト値で初期化するだけです。 文字列はnullに初期化され、整数はゼロに初期化されます。

これで、クラスを作成するときにオブジェクトにフィールドを定義する必要があるため、クラスには特定のコンストラクターがあります。

Car(String type, String model) {
    // ...
}

要約すると、車を定義するクラスを作成しました。 そのプロパティは、クラスのオブジェクトの状態を含むフィールドによって記述され、その動作はメソッドを使用して記述されます。

3. オブジェクト

クラスはコンパイル時に変換されますが、オブジェクトは実行時にクラスから作成されます

クラスのオブジェクトはインスタンスと呼ばれ、コンストラクターを使用してそれらを作成および初期化します。

Car focus = new Car("Ford", "Focus", "red");
Car auris = new Car("Toyota", "Auris", "blue");
Car golf = new Car("Volkswagen", "Golf", "green");

これで、すべて1つのクラスからさまざまなCarオブジェクトを作成しました。 これがすべてのポイントです。1つの場所で設計図を定義し、それを多くの場所で何度も再利用します。

これまでのところ、3つの Car オブジェクトがあり、速度がゼロであるため、それらはすべてパークされています。 increaseSpeed メソッドを呼び出すことで、これを変更できます。

focus.increaseSpeed(10);
auris.increaseSpeed(20);
golf.increaseSpeed(30);

今、私たちは車の状態を変更しました–それらはすべて異なる速度で動いています。

さらに、クラス、そのコンストラクター、フィールド、およびメソッドへのアクセス制御を定義することができ、定義する必要があります。 次のセクションで説明するように、アクセス修飾子を使用してこれを行うことができます。

4. アクセス修飾子

前の例では、コードを単純化するためにアクセス修飾子を省略しました。 そうすることで、実際にはデフォルトのpackage-private修飾子を使用しました。 この修飾子を使用すると、同じパッケージ内の他のクラスからクラスにアクセスできます。

通常、コンストラクターには public 修飾子を使用して、他のすべてのオブジェクトからのアクセスを許可します。

public Car(String type, String model, String color) {
    // ...
}

クラス内のすべてのフィールドとメソッドは、特定の修飾子によるアクセス制御も定義する必要があります。 クラスには通常パブリック修飾子がありますが、フィールドをプライベートに保つ傾向があります。

フィールドはオブジェクトの状態を保持するため、その状態へのアクセスを制御する必要があります。 それらのいくつかはプライベート、その他はパブリックのままにしておくことができます。 これは、ゲッターとセッターと呼ばれる特定の方法で実現します。

完全に指定されたアクセス制御を備えたクラスを見てみましょう。

public class Car {
    private String type;
    // ...

    public Car(String type, String model, String color) {
       // ...
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    // ...
}

クラスはpublicとマークされているため、どのパッケージでも使用できます。また、コンストラクターは public です。これは、このクラスから他のオブジェクト内にオブジェクトを作成できることを意味します。

フィールドはプライベートとしてマークされています。つまり、オブジェクトから直接アクセスすることはできませんが、ゲッターとセッターを介してフィールドにアクセスできます。

typeフィールドとmodelフィールドには、オブジェクトの内部データが保持されているため、ゲッターとセッターはありません。 これらは、初期化中にコンストラクターを介してのみ定義できます。

さらに、 color はアクセスおよび変更できますが、 speed はアクセスのみが可能で、変更はできません。 特殊なpublicメソッドincreaseSpeed()およびdecreaseSpeed()を介して速度調整を実施しました。

つまり、アクセス制御を使用してオブジェクトの状態をカプセル化します。

5. 結論

この記事では、Java言語の2つの基本要素であるクラスとオブジェクトについて説明し、それらが使用される方法と理由を示しました。 また、アクセス制御の基本を紹介し、その使用法を示しました。

Java言語の他の概念を学ぶために、次のステップとして継承スーパーキーワード、および抽象クラスについて読むことをお勧めします。

この例の完全なソースコードは、GitHubから入手できます。