―Javaプログラミングの前提知識―
2001/7/13
クラスの定義とオブジェクトの生成を理解する |
今回の内容
|
クラスを定義する クラスからオブジェクトを生成する サンプルコード |
Javaは、オブジェクト指向的な考え方を表現しやすいように考えられたプログラミング言語です。ここでは、Java言語でどのようにクラスを定義し、オブジェクトを生成し、オブジェクトを操作すればよいかを説明します。
オブジェクト指向の考え方については「オブジェクト指向とクラスを理解する」を参照してください。
クラスを定義する |
クラスを定義するにはキーワードclassを用います。最初にclassを書き、続いて定義するクラスの名前を書きます。次に、中カッコ“{}”を書けば、クラスの完成です。例えば車を表すクラスCarは以下のように書けます。
public class Car { // クラス定義
|
上のクラスCarの定義では、キーワード“public”を指定することにより、Carクラスが含まれているパッケージ以外のパッケージ中のクラスがこのクラスを参照できるようにしています。ここでいう、パッケージとはクラスの集まりのことです。詳しくは「パッケージを理解し利用する」を参照してください。
上のクラスCarの定義を“Car.java”というファイルに書いて実際にjavacでコンパイルすると、正しくコンパイルできて、“Car.class”というファイルができます。javacコマンドの使い方については、「javacコマンドを使いこなす」を参照してください。
■クラスの中身を書く
上記のCarクラスは立派なクラス定義ですが、オブジェクトが外部とどのように相互作用するかや、どのような状態を持つか、どのように振る舞うかについては何も記述していません。次に、クラスの中にどのようにオブジェクトの外部との相互作用、状態、振る舞いを定義するかについて説明します。
<オブジェクトの状態>
Java言語では、オブジェクトの状態はフィールドとして定義します。フィールドとは、データを格納する場所のことです。オブジェクトのフィールドのことをメンバ変数といいます。
メンバ変数はクラス定義の中に定義します。具体的には、次の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() { // メソッド
|
ここまでで、クラスの定義の仕方を説明しました。 次に、実際にクラスからオブジェクトを生成し、操作する方法を説明します。
クラスからオブジェクトを生成する |
■オブジェクトの生成
クラスからオブジェクトを生成するには、キーワード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 void
speedUp() { // メソッドspeedUpの定義 } // 運転手を表すクラス
// プログラムの始まり Car car = new Car();
car.speedUp(); int after
= car.getSpeed(); System.out.println("スピードアップ前の速度は
" + before + " です。"); // プログラムの終わり } |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|