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


 

クラスとインスタンス

1 クラス

オブジェクト指向プログラミングでは、「オブジェクト」は、別のオブジェクトによってクラスから作られます。クラスはオブジェクトの設計図のようなものであり、プログラマはこのクラスをコーディングします。この設計図(クラス)からは任意の個数のオブジェクトを作ることができます。ここで、オブジェクトの状態を保持する変数がフィールド(メンバー変数、属性)であり、動作/機能を記述したものがメソッドです。

 

<アクセス修飾子> class <クラス名> [extends <基底クラス名>] [implements <インタフェース名>[,...]] { <アクセス修飾子> <型> <変数名> = <値>; //フィールド <アクセス修飾子> <クラス名>([<引数>[,...]]) { //コンストラクタ インスタンス化処理 } <アクセス修飾子> <型> <メソッド名>([<引数>[,...]]) { //メソッド 処理 } }

変数やメソッドにはこの4種類いずれかのアクセス修飾子を付けることができます。クラスには public か指定なしとすることができます。

アクセス修飾子同一クラス同一パッケージ派生クラスすべて
public
protected×
なし(パッケージプライベート)××
private×××

フィールド (メンバ変数)
オブジェクトの状態を保持する変数です。これらを初期化することでクラスをインスタンス化します。今まで扱ってきたメソッド内で定義された変数は当該メソッド内部でしか有効ではありませんが、フィールドはクラスをインスタンス化して作ったオブジェクトが持続する限り存在します。ちなみに、今まで登場してきた変数のようにメソッド内で宣言する変数のことを「一時変数」、「ローカル変数」と呼びます。
コンストラクタ
初期処理をする特殊なメソッドといえるものです。これを呼び出すことでクラスのフィールドを初期化してメモリ上にオブジェクトを展開します。メモリ上の実態をインスタンスと呼び、クラスからオブジェクトを作ることをインスタンス化と呼びます。インスタンス化するときには必ずコンストラクタが呼ばれています。
デストラクタ (C++ など一部の言語)
終了処理をする特殊なメソッドといえるものです。オブジェクトが代入された変数が破棄されるなどして、どこからも参照されなくなったときに、必ず呼び出されます。
メソッド (メンバ関数)
オブジェクトの機能/働きが記述されています。オブジェクトを操作する方法だといえます。基本的に、フィールドにはメソッドを通してアクセスします。メソッドに記述するのはコンピュータ制御であり、オブジェクト指向というのは、オブジェクトのメソッドを通してコンピュータ制御を指示するプログラミングスタイルのことです。

2 インスタンス

クラスからオブジェクトを作ることをインスタンス化と呼び、オブジェクト固有のメモリ上のデータをインスタンスと呼びます。


クラスをインスタンス化してオブジェクトを作成するには、new キーワードを利用します。

<クラス名> <変数> = new <クラス名>([<引数>[, <引数>, ...]])

オブジェクトの参照を代入する変数は、具体的な定数が代入されている基本データ型の変数と区別して、オブジェクト型変数と呼ばれます。例えば、String クラスから生成されたオブジェクトは String 型変数に代入可能であり、Vector クラスから生成されたオブジェクトは Vector 型変数に代入可能です。

このようにして作ったオブジェクトの private でないメソッドを利用するには次のようにします。

<変数>.メソッド名([<引数>[, <引数>, ...]])

privateでないフィールドならば、その利用も同様です。

<変数>.フィールド名


それでは、自動車を考えて見ましょう。「人が乗って運転して道路を走る。目的によっていろいろな仕事をする。」...といったところでしょうか。それでは自動車を Car クラスとして作成してみましょう。

Car.java
public class Car { protected String kind = "自動車"; public Car() { } //(2) public Car(String kind) { this.kind = kind; } public void run() { System.out.println(this.kind + "が走る。"); } public void work() { System.out.println(""); } }

Car クラスは、引数がないコンストラクタと引数がひとつのコンストラクタ、そして kind というフィールドと run というメソッドを持っています。それでは、この Car クラスのインスタンスを生成し、run メソッドを呼び出すクラスも作成してみましょう。

Main.java
public class Main { public static void main(String[] args) { Car car = new Car(); //(1) car.run(); //(3) } }
  1. 〈処理の流れ〉
  2. サブクラス Car のオブジェクト car を宣言生成します。
  3. オブジェクト生成時、コンストラクタが実行されます。
  4. メソッド run を呼び出しますCar クラスの run メソッドが実行されます。

実行結果です。

自動車が走る。