―Javaプログラミングの前提知識―

前田俊行
2001/7/13
Javaプログラミング
ワンポイントレクチャーについて

   クラスの定義とオブジェクトの生成を理解する

今回の内容
クラスを定義する
クラスからオブジェクトを生成する

サンプルコード

 Javaは、オブジェクト指向的な考え方を表現しやすいように考えられたプログラミング言語です。ここでは、Java言語でどのようにクラスを定義し、オブジェクトを生成し、オブジェクトを操作すればよいかを説明します。

 オブジェクト指向の考え方については「オブジェクト指向とクラスを理解する」を参照してください。

 クラスを定義する

 クラスを定義するにはキーワードclassを用います。最初にclassを書き、続いて定義するクラスの名前を書きます。次に、中カッコ“{}”を書けば、クラスの完成です。例えば車を表すクラスCarは以下のように書けます。

public class Car { // クラス定義

}

 上のクラスCarの定義では、キーワード“public”を指定することにより、Carクラスが含まれているパッケージ以外のパッケージ中のクラスがこのクラスを参照できるようにしています。ここでいう、パッケージとはクラスの集まりのことです。詳しくは「パッケージを理解し利用する」を参照してください。

上のクラスCarの定義を“Car.java”というファイルに書いて実際にjavacでコンパイルすると、正しくコンパイルできて、“Car.class”というファイルができます。javacコマンドの使い方については、javacコマンドを使いこなす」を参照してください。

■クラスの中身を書く

 上記のCarクラスは立派なクラス定義ですが、オブジェクトが外部とどのように相互作用するかや、どのような状態を持つか、どのように振る舞うかについては何も記述していません。次に、クラスの中にどのようにオブジェクトの外部との相互作用、状態、振る舞いを定義するかについて説明します。

<オブジェクトの状態>

 Java言語では、オブジェクトの状態はフィールドとして定義します。フィールドとは、データを格納する場所のことです。オブジェクトのフィールドのことをメンバ変数といいます。

 メンバ変数はクラス定義の中に定義します。具体的には、次の3つのことを指定して定義します。

  1. 外部のクラスからの見え方
  2. データの種類
  3. メンバ変数の名前

 以下は、クラスCarの定義に車の速度を表すspeedという名前のメンバ変数を追加した例です。

public class Car { // クラス定義
  private int speed; // メンバ変数speed
}

 上の例では、privateが、メンバ変数であるspeedの外部のクラスからの見え方を指定しています。privateを指定することで、speedはクラスCar以外のクラスからのアクセスを禁止しています。

 また、intはspeedが格納するデータの種類を指定しています。intはspeedが、32bit整数のプリミティブ値データを格納していることを表しています。メンバ変数に指定できるデータの種類は、大きく分けてプリミティブ値とオブジェクト参照の2つがあります。プリミティブ値とは、整数や浮動小数点数などのことです。オブジェクト参照とは、オブジェクトが存在する場所を表すデータのことです。オブジェクトの操作は、常にそのオブジェクトへのオブジェクト参照を介して行います。

<オブジェクトの外部との相互作用、振る舞い>

 Java言語では、オブジェクトの外部との相互作用やオブジェクトの振る舞いは、メソッドとして定義します。例えば、運転手が車を運転する例では、車を表すクラスには「スピードを上げる」メソッドと、「スピードを落とす」メソッドが定義されています。それぞれのメソッドには車がスピードを上げたり下げたりするための細かい手順が記述されています。運転手はスピードを上げるために、アクセルペダルを踏み込んで、車の「スピードを上げる」メソッドを呼び出します。すると、車はメソッドに記述されている細かい手順に従って実際に作業を行い、スピードを上げます。

 メソッドもメンバ変数と同様に、クラス定義の中に定義します。例えば、車の速度を上げるためのメソッドspeedUpは以下のように定義できます。

public class Car { // クラス定義
  private int speed; // メンバ変数
  public void speedUp() { // メソッド
    speed += 10; // メンバ変数speedの値を10増やす
  }

}

 ここまでで、クラスの定義の仕方を説明しました。 次に、実際にクラスからオブジェクトを生成し、操作する方法を説明します。

 クラスからオブジェクトを生成する

■オブジェクトの生成

 クラスからオブジェクトを生成するには、キーワードnewを用います。例えば、クラスCarのオブジェクトを生成するには以下のように書きます。

new Car();

 ちなみに、Carの後ろのカッコ“( )”は、クラスCarのオブジェクトを生成するときに呼び出されるコンストラクタという特別なメソッドに値を何も渡さないことを表しています。コンストラクタについては、「コンストラクタとは何ですか」を参照してください。

 さて、上のようにすればオブジェクトを生成することができますが、このままでは、生成したオブジェクトがどこに存在するか分からないため、そのオブジェクトを操作することができません。生成したオブジェクトのメソッドを呼び出したいのならば、そのオブジェクトへのオブジェクト参照を保存しておく必要があります。オブジェクト参照があればメソッドを呼び出すことができます。

 オブジェクト参照を保存する方法は2種類あります。第1の方法は、すでに説明した、オブジェクトのメンバ変数に保存する方法です。例えば、クラスCarのオブジェクトを保存するには、クラスに、

private Car car;

のようなメンバ変数carを定義します。そして、オブジェクトを生成するときに、

car = new Car();

のように書くと、生成されたオブジェクトへのオブジェクト参照がメンバ変数carに保存されます。

 第2の方法は、メソッドの一時変数に保存する方法です。メソッドの一時変数とは、メソッドが呼び出されている間だけ有効な、データの保存場所です。一時変数は、メンバ変数と同じようにプリミティブ値やオブジェクト参照を保存することができます。一時変数を定義するには、メソッド中に、保存するデータの種類と変数名を書きます。例えば、クラスCarのオブジェクトへのオブジェクト参照を保存する一時変数carを定義するには、メソッド中に以下のように書きます。

Car car;

 そして、同じメソッド中で、オブジェクトを生成するときに、

car = new Car();

のように、生成したオブジェクトへのオブジェクト参照を一時変数carに保存します。

■オブジェクトの操作

 オブジェクト参照を保存していれば、そのオブジェクト参照が指し示すオブジェクトを操作することができます。オブジェクトに対する操作には、メンバ変数のアクセスと、メソッド呼び出しの2種類があります。

<オブジェクトのメンバ変数のアクセス>

 オブジェクトのメンバ変数にアクセスするには、アクセスしようとするオブジェクトへのオブジェクト参照と、メンバ変数の名前を“.”でつなげて書きます。例えば、クラスCarのオブジェクトへのオブジェクト参照が一時変数carに保存されているときに、そのオブジェクトのメンバ変数speedを一時変数currentSpeedに保存するには以下のようにします。

int currentSpeed = car.speed; // メンバ変数speedにアクセス

<オブジェクトのメソッド呼び出し>

 オブジェクトのメソッドを呼び出すには、そのオブジェクトへのオブジェクト参照と、呼び出そうとしているメソッド名を記号"."でつなげて書きます。例えば、クラスCarのオブジェクトへのオブジェクト参照が一時変数carに保存されているときに、メソッドspeedUpを呼び出すには、以下のようにします。

car.speedUp(); //メソッドspeedUpを呼び出す


 サンプルコード

 この節で説明した、クラスの定義やオブジェクトの生成、操作の方法を以下のような具体的なプログラムにまとめてみました。

 このプログラムは、車を表すクラスCarと運転手を表すクラスTestDriverの2つのクラスでできています。クラスCarをソースファイルCar.javaに、クラスTestDriverをソースファイルTestDriver.javaに書いて、javacでコンパイルしてください。実行するには、javaコマンドを用いてコマンドプロンプトで以下のように入力します。

java TestDriver

// 車を表すクラス
public class Car { // クラス定義


  private int speed; // メンバ変数speedの定義

  public void speedUp() { // メソッドspeedUpの定義
    speed += 10; // メンバ変数speedの値を10増やす。
  }


  public int getSpeed() { // メソッドgetSpeedの定義
    return speed; // メンバ変数speedの値をメソッドを呼び出した側に返す。
  }
}


// 運転手を表すクラス
public class TestDriver { // クラス定義


  public static void main(String[] args) { // 特別なメソッド
  // Java VMはこのメソッドから実行を開始する。

  
// プログラムの始まり

  Car car = new Car();
  // クラスCarのオブジェクトを生成し、一時変数carにオブジェクト参照を保存する。


  int before = car.getSpeed();
  // carの参照するオブジェクトのメソッドgetSpeedを呼び出し、
  // carのスピードを一時変数beforeに保存する。


  car.speedUp();
  // carの参照するオブジェクトのメソッドspeedUpを呼び出す。

  int after = car.getSpeed();
  // carの参照するオブジェクトのメソッドgetSpeedを呼び出し、
  // carのスピードを一時変数afterに保存する。

  System.out.println("スピードアップ前の速度は " + before + " です。");
  System.out.println("スピードアップ後の速度は " + after + " です。");
  // 一時変数beforeとafterの中身をコマンドプロンプトに表示する。

  // プログラムの終わり
  }

}

 

Javaプログラミング・ワンポイントレクチャー INDEX





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間